Python类说明
元类说明
type
type
:元类,python中所有类都由type
创建
1 | class = type( |
参数
cls_name
:类名称bases
:父类元组dict
:类方法、属性
返回值:类的别名
元类作用
拦截类创建->修改类->返回修改后的类(创建类对象)
元类的作用和函数相似
- python并不关心类对象是否是由真正的元类创建
- 可以指定元类为一个函数,而非继承自
type
的元类
但仍应尽量将元类指定为继承自
type
的对象- 元类应用场景一般比较复杂,使用类可以更好的管理代码
- 默认元类是
type
类,类继承保持一致性意图比较明显,且 可以使用type中的方法 - 元类可以使用一些类中特有的方法:
__new__
,__init__
等
- 如果不确定是否需要用元类,就不应该使用
自定义元类
1 | class UpperAttrMeta(type): |
使用自定义元类UppAttrMeta创建的类Foo中定义的__init__
、
__new__
等函数无意义,因为该类不仅是通过元类创建,也是
通过元类初始化
类
Foo
通过UpperAttrMeta
创建,而UppAttrMeta
本身没有 实现自定义__init__
,默认继承于object
因此Foo类的创建就有object的init完成 segmentfault.com/q/1010000004438156 这个是原话,不明白什么意思了
但是如果元类仅仅是
pass
,如下:1
2class MetaCls(type):
pass;使用此自定义元类,类定义中的
__init__
、__new__
有效
类创建
py2自定义元类
python创建类对象步骤
__metaclass__
指定创建类使用的元类按照优先级:类定义内 > 祖先类内 > 模块内 >
type
, 查找__metaclass__
,并使用其创建类对象,若前三者 均未定义__metaclass__
,则使用type
创建自定义元类就是为
__metaclass__
指定自定义值python只是将创建类的参数传递给
__metaclass__
,并不 关心__metaclass__
是否是一个类cls()
返回一个类对象,是相当于调用cls.__new__
- 所以可以指定
__metaclass__
为一个函数
1 |
|
元类示例
缓存实例
1 | import weakref |
捕获类属性定义顺序
1 | from collection import OrderedDict |
有可选参数元类
为了使元类支持关键字参数,必须在__prepare__
、__new__
、
__init__
方法中使用KEYWORDS_ONLY关键字参数
1 | class MyMeta(type): |