python高级编程(六)--元类、内建属性

来源:互联网 发布:冒泡排序java从小到大 编辑:程序博客网 时间:2024/06/01 08:23

1. 元类

  • 类也是对象
    在理解元类之前,我们需要掌握python中的类。在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在python中这一点仍然成立:
>>> class Obj(object):pass>>> my_obj= Obj()>>> print my_obj<__main__.Obj obj at 0x8974f2c>

但是在python类还远不止如此。类同样也是一种对象。是的,没错,就是对象。只有你使用关键字class,python解释器在执行的时候就会创建一个对象。

  • 动态地创建类
    因为类也是对象,你可以在运行时动态的创建它们,就像其他任何对象一样。首先,你可以再函数中创建类,使用class关键字即可。
>>> def choose_class(name):      if name == 'foo':            class Foo(object):                pass            return Foo    # 返回的是类,不是类的实例        else:            class Bar(object):                pass            return Bar>>> MyClass = choose_class('foo')>>> print MyClass     # 函数返回的是类,不是类的实例<class '__main__'.Foo>>>> print MyClass()   # 你可以通过这个类创建类实例,也就是对象<__main__.Foo object at 0x89c6d4c>

但这不够动态,因为你仍然需要自己编写整个类的代码。由于类也是对象,所以它们必须是通过什么东西来生成的才对。当你使用class关键字时,python解释器自动创建这个对象。但就和python中的大多数事情一样,python仍然提供给你手动处理的方法。还记得内建函数type吗?这个古老但强大的函数就够让你知道一个对象的类型是什么:

>>> print type(1)<type 'int'>>>> print type("1")<type 'str'>>>> print type(ObjectCreator)<type 'type'>>>> print type(ObjectCreator())<class '__main__.ObjectCreator'>

type有一种完全不同的功能,它也能动态的创建类。
type可以接受一个类的描述作为参数,然后返回一个类。(可能你会觉得根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在python中是为了保持向后兼容性)

tpye可以像这样工作:

type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
Test2 = type("Test2",(),{}) #定了一个Test2类In [5]: Test2() #创建了一个Test2类的实例对象Out[5]: <__main__.Test2 at 0x10d406b38>
  • 使用type创建带有属性的类
    type接受一个字典来为类定义属性
>>> Foo = type("Foo",(),{"bar":True})可以翻译为:>>> class Foo(object):...             bar = True

说明:type的第2个参数,元组中是父类的名字,而不是字符串。添加的属性的类属性,并不是实例属性

  • 使用type创建带有方法的类
def echo_bar(self)print(self.bar)#让FooChild类中的echo_bar属性,指向了上面定义的函数FooChild = type("FooChild",(Foo,),{"echo_bar":echo_bar})
  • 添加静态方法
In [36]: @staticmethod    ...: def testStatic():    ...:     print("static method ....")    ...:In [37]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar, "testStatic": testStatic})In [38]: fooclid = Foochild()In [39]: fooclid.testStaticOut[39]: <function __main__.testStatic>
  • 添加类方法
In [42]: @classmethod    ...: def testClass(cls):    ...:     print(cls.bar)    ...:In [43]: Foochild = type('Foochild', (Foo,), {"echo_bar":echo_bar, "testStatic":testStatic, "testClass":testClass})
  • 什么是元类呢?
    元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象,不是吗?但是我们已经学习到了python中的类也是对象。好吧,元类就是用来创建这些类(对象)的,元类就是类的类,你可以这样理解为:
MyClass = MetaClass()MyObject = MyClass()

你已经看到了type可以让你像这样做:

MyClass = type('MyClass', (), {})

这是因为函数type实际上是一个元类。type就是python在背后用来创建所有类的元类。现在你想指定为什么type全部采用小写形式而不是Type呢?好吧这是为了和str保持一致性,str是用来创建字符串对象的类,而int是用来创建整数对象的类。type就是创建类对象的类。你可以通过检查__class__属性来看到这一点。python中所有的东西,注意,我是指所有的东西–都是对象。这包括整数、字符串、函数以及类。它们全部都是对象。而它们都是一个类创建而来。

2. 内建属性

常用专有属性 说明 触发方式 __init__ 构造初始化函数 创建实例后,赋值时使用,在__new____new__ 生成实例所需属性 创建实例时 __class__ 实例所在的类 实例.__class__ __str__ 实例字符串表示,可读性 print(类实例),如没实现,使用repr结果 __repr__ 实例字符串表示,准确性 类实例 回车 或者 print(repr(类实例)) __del__ 析构 del删除实例 __dict__ 实例自定义属性 vars(实例.__dict__) __doc__ 类文档,子类不继承 help(类或实例) __getattribute__ 属性访问拦截器 访问实例属性时 __bases__ 类的所有父类构成元素 类名.__bases__

3. 库

  • 常用标准库
标准库 说明 builtins 内建函数默认加载 os 操作系统接口 sys Python自身的运行环境 functools 常用的工具 json 编码和解码 JSON 对象 logging 记录日志,调试 multiprocessing 多进程 threading 多线程 copy 拷贝 time 时间 datetime 日期和时间 calendar 日历 hashlib 加密算法 random 生成随机数 re 字符串正则匹配 socket 标准的 BSD Sockets API shutil 文件和目录管理 glob 基于文件通配符搜索


  • 常用扩展库
扩展库 说明 requests 使用的是 urllib3,继承了urllib2的所有特性 urllib 基于http的高层库 scrapy 爬虫 beautifulsoup4 HTML/XML的解析器 celery 分布式任务调度模块 redis 缓存 Pillow(PIL) 图像处理 xlsxwriter 仅写excle功能,支持xlsx xlwt 仅写excle功能,支持xls ,2013或更早版office xlrd 仅读excle功能 elasticsearch 全文搜索引擎 pymysql 数据库连接库 mongoengine/pymongo mongodbpython接口 matplotlib 画图 numpy/scipy 科学计算 django/tornado/flask web框架 xmltodict xml 转 dict SimpleHTTPServer 简单地HTTP Server,不使用Web框架 gevent 基于协程的Python网络库 fabric 系统管理 pandas 数据处理库 scikit-learn 机器学习库