元类,
1.类也是对象
大多数语言中,类就是一组用来描述如何生成一个对象的代码段,python中仍然成立。
在python中类同样也是一种对象。
python解释器在执行的时候就会创建一个对象。
>>> class ObjectCreator(object):
… pass
…
于是乎你可以对它做如下的操作:
- 你可以将它赋值给一个变量
- 你可以拷贝它
- 你可以为它增加属性
- 你可以将它作为函数参数进行传递
>>> print ObjectCreator # 你可以打印一个类,因为它其实也是一个对象 <class '__main__.ObjectCreator'> >>> def echo(o): … print o … >>> echo(ObjectCreator) # 你可以将类做为参数传给函数 <class '__main__.ObjectCreator'> >>> print hasattr(ObjectCreator, 'new_attribute') Fasle >>> ObjectCreator.new_attribute = 'foo' # 你可以为类增加属性 >>> print hasattr(ObjectCreator, 'new_attribute') True >>> print ObjectCreator.new_attribute foo >>> ObjectCreatorMirror = ObjectCreator # 你可以将类赋值给一个变量 >>> print ObjectCreatorMirror()
<__main__.ObjectCreator object at 0x8997b4c>
动态的创建类
使用关键字class即可。python解释器会自动创建这个对象,可以在运行时动态创建。
内建函数type
>>> print type(1) #数值的类型
<type 'int'>
>>> print type("1") #字符串的类型
<type 'str'>
>>> print type(ObjectCreator()) #实例对象的类型
<class '__main__.ObjectCreator'>
>>> print type(ObjectCreator) #类的类型
<type 'type'>
使用type动态创建类
比如下面的代码:
In [2]: class Test: #定义了一个Test类
...: pass
...:
In [3]: Test() #创建了一个Test类的实例对象
Out[3]: <__main__.Test at 0x10d3f8438>
可以手动像这样创建:
Test2 = type("Test2",(),{}) #定了一个Test2类
In [5]: Test2() #创建了一个Test2类的实例对象
Out[5]: <__main__.Test2 at 0x10d406b38>
4。使用type创建带有属性的类
type接受一个字典来为类定义属性,因此
>>> Sun = type('Foo', (), {'bar':True})
可以翻译为:
>>> class Sun(object):
… bar = True
并且可以将Sun当成和普通类一样来使用:
>>> print Sun
<class '__main__.Sun'>
>>> print Sun.bar
True
>>> f = Sun()
>>> print f
<__main__.Sun object at 0x8a9b84c>
>>> print f.bar
True
注意:
*type的第2个参数,元组中是父类的名字,而不是字符串。
* 添加的属性是类属性,而不是实例属性。
5。什么是元类?
元类就是用来创建类的。python中的类也是对象。
元类就是用来创建类的(对象)的,元类就是类的类。
*******************************************
python中所有的东西,都是对象。包括整数,字符串,函数以及类。
它们全都是对象,而且它们都从一个类创建而来,这个类就是type。
>>> age = 35
>>> age.__class__
<type 'int'>
>>> name = 'bob'
>>> name.__class__
<type 'str'>
>>> def foo(): pass
>>>foo.__class__
<type 'function'>
>>> class Bar(object): pass
>>> b = Bar()
>>> b.__class__
<class '__main__.Bar'>
6.自定义元类
__metaclass__实际上可以被任意调用,它并不需要是一个正式的类。