在python中,关于对象权威的说法是metaclasses,classes,instance三类对象
python中的类,本质上也是一个对象,type就是元类, 除了检测类型的功能外, 也是创建类的类(另外还有创建抽象类的元类ABCmeta)。
python通过type()函数创建类
type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)...的定义:
要创建一个class对象,type()函数依次传入3个参数:
- class的名称;
- 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
- class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。
metaclass自定义元类
metaclass,直译为元类,简单的解释就是:
当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。
但是如果我们想创建出类呢?那就必须根据metaclass创建出类,所以:先定义metaclass元类,然后创建类。
连接起来就是:_______
先定义metaclass元类,就可以创建类,最后创建实例。
遵循上面的三部曲, 首先先定义metaclass元类:
# metaclass是创建类,所以必须从`type`类型派生:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
注意:
__new__()
方法接收到的参数依次是:
- 当前准备创建的类的对象;
- 类的名字;
- 类继承的父类集合;
- 类的方法集合。
然后创建类
class MyList(list):
__metaclass__ = ListMetaclass # 指示使用ListMetaclass来定制类
然后实例化对象
#可以正常调用add
L = MyList()
L.add(1)
网友评论