元类是类的类。类定义了类的实例(即对象)的行为,而元类定义了类的行为方式。类是元类的实例。
虽然在Python中你可以为元类使用任意的callables(比如Jerub节目),但更好的方法是让它成为一个真正的类本身。type是Python中常用的元类。type它本身就是一个类,它是它自己的类型。你将无法type在Python中重新创建纯粹的东西,但是Python会有所作为。要在Python中创建自己的元类,你真的只想要子类type。
元类最常用作类工厂。当您通过调用类创建对象时,Python通过调用元类创建一个新类(当它执行'class'语句时)。结合法线__init__和__new__方法,元类因此允许您在创建类时执行“额外的事情”,例如使用某些注册表注册新类或者完全替换其他类。
当class被执行的语句,Python的首先执行的主体class声明为代码的正常块。生成的命名空间(dict)保存了将要进行的类的属性。元类是通过查看待定类的基类(继承的元类),在待定类的__metaclass__属性(如果有)或__metaclass__全局变量来确定的。然后使用类的名称,基数和属性调用元类来实例化它。
但是,元类实际上定义了类的类型,而不仅仅是它的工厂,所以你可以用它们做更多的事情。例如,您可以在元类上定义常规方法。这些元类方法就像类方法一样,它们可以在没有实例的类上调用,但它们也不像类方法,因为它们不能在类的实例上调用。type.subclasses()是type元类的方法示例。您还可以定义常规的“魔术”方法,例如__add__,__iter__以及__getattr__实现或更改类的行为方式。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。