码迷,mamicode.com
首页 > 编程语言 > 详细

python 元类

时间:2017-12-21 19:36:45      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:type   告诉   att   bar   能力   解释器   返回   attribute   style   

一、类也是对象

只要使用关键字class,Python解释器在执行的时候就会创建一个对象。下面的代码段:

1 class ObjectCreator(object):
2     pass

将在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力。

它的本质仍然是一个对象,于是乎你可以对它做如下的操作:

1)   你可以将它赋值给一个变量

2)   你可以拷贝它

3)   你可以为它增加属性

4)   你可以将它作为函数参数进行传递

 1 >>> class ObjectCreator(object):
 2 ...     pass
 3 ... 
 4 >>> print(ObjectCreator)    # 可以打印,因为也是个对象
 5 <class __console__.ObjectCreator>
 6 >>> print(type(ObjectCreator))
 7 <class type>
 8 >>> def echo(o):
 9 ...     print(o)
10 ... 
11 >>> echo(ObjectCreator)     # 当做参数
12 <class __console__.ObjectCreator>
13 >>> hasattr(ObjectCreator, new_attribute) 
14 False
15 >>> ObjectCreator.new_attribute = foo    # 增加属性
16 >>> hasattr(ObjectCreator, new_attribute)
17 True
18 >>> ObjectCreator.new_attribute
19 foo
20 >>> ObjectCreatorMirror = ObjectCreator    # 赋值给变量
21 >>> ObjectCreatorMirror()
22 <__console__.ObjectCreator object at 0x0000000002CB38D0>

二、使用type动态创建类

type可以接受一个类的描述作为参数,然后返回一个类。type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

1 >>> MyShinyClass = type(MyShinyClass, (), {})
2 >>> MyShinyClass
3 <class __console__.MyShinyClass>
4 >>> MyShinyClass()
5 <__console__.MyShinyClass object at 0x0000000002CB3978>
1 >>> MyShiny = type(MyShinyClass, (), {})
2 >>> MyShiny
3 <class __console__.MyShinyClass>
4 >>> MyShinyClass
5 <class __console__.MyShinyClass>
>>> Foo = type(Foo, (), {bar: True})
>>> Foo.bar
True
>>> f = Foo()
>>> f.bar
True
1 >>> FooChild=type(FooChild, (Foo,),{})
2 >>> FooChild
3 <class __console__.FooChild>
4 >>> FooChild.bar
5 True
>>> def echo_bar(self):
…       print(self.bar)
…
>>> FooChild = type(FooChild, (Foo,), {echo_bar: echo_bar})
>>> hasattr(Foo, echo_bar)
False
>>> hasattr(FooChild, echo_bar)
True
>>> my_foo = FooChild()
>>> my_foo.echo_bar()
True

三、元类

元类就是用来创建类的“东西”。元类创建类对象,类对象创建实例对象。

type可以动态创建类,是因为函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类。

四、__metaclass__属性

当你写如下代码时 :

1 class Foo(Bar):
2     pass

Python做了如下的操作:

Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧跟我的思路)。如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作。如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__metaclass__,并尝试做同样的操作。如果还是找不到__metaclass__,Python就会用内置的type来创建这个类对象。

五、自定义元类

元类的主要目的就是为了当创建类时能够自动地改变类。通常,你会为API做这样的事情,你希望可以创建符合当前上下文的类。假想一个很傻的例子,你决定在你的模块里所有的类的属性都应该是大写形式。有好几种方法可以办到,但其中一种就是通过在模块级别设定__metaclass__。采用这种方法,这个模块中的所有类都会通过这个元类来创建,我们只需要告诉元类把所有的属性都改成大写形式就万事大吉了。

 

python 元类

标签:type   告诉   att   bar   能力   解释器   返回   attribute   style   

原文地址:http://www.cnblogs.com/gundan/p/8081809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!