python 元类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python 元类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2732字,纯文字阅读大概需要4分钟。
内容图文
![python 元类](/upload/InfoBanner/zyjiaocheng/1206/6d305537a71c475ebb9b6c14bd9613d3.jpg)
一、类也是对象
只要使用关键字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‘) 14False 15 >>> ObjectCreator.new_attribute = ‘foo‘# 增加属性16 >>> hasattr(ObjectCreator, ‘new_attribute‘) 17True 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__。采用这种方法,这个模块中的所有类都会通过这个元类来创建,我们只需要告诉元类把所有的属性都改成大写形式就万事大吉了。
原文:http://www.cnblogs.com/gundan/p/8081809.html
内容总结
以上是互联网集市为您收集整理的python 元类全部内容,希望文章能够帮你解决python 元类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。