元类

元类,

1.类也是对象

大多数语言中,类就是一组用来描述如何生成一个对象的代码段,python中仍然成立。

在python中类同样也是一种对象。

python解释器在执行的时候就会创建一个对象。

>>> class ObjectCreator(object):
…       pass
…
于是乎你可以对它做如下的操作:
  1. 你可以将它赋值给一个变量
  2. 你可以拷贝它
  3. 你可以为它增加属性
  4. 你可以将它作为函数参数进行传递
    >>> 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__实际上可以被任意调用,它并不需要是一个正式的类。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值