在Python中,元类(metaclass)是用于创建类的类。元类允许你控制类的创建行为,可以在类定义之前或之后修改类的属性、方法等。
可以把类看成是metaclass创建出来的“实例”。
用元类为自定义的MyClass类新增属性和方法。
class MyMetaClass(type):
def __new__(cls, name, bases, attrs):
# 在创建类之前修改类的属性或方法
attrs['my_attr'] = '嗨!我的新属性。'
attrs['my_method'] = lambda self: print('嗨!我的新方法。')
return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=MyMetaClass):
pass
my_obj = MyClass()
print(my_obj.my_attr) # 输出: 嗨!我的新属性。
my_obj.my_method() # 输出: 嗨!我的新方法。
在上面的示例中,我们定义了一个名为MyMetaClass
的元类,并重写了__new__
方法。在__new__
方法中,我们通过修改attrs
参数来添加一个属性my_attr
和一个方法my_method
。
然后,我们定义了一个类MyClass
,并将MyMetaClass
指定为其元类。当我们创建MyClass
类对象时,MyMetaClass
的__new__
方法会被调用,从而修改了MyClass
的属性和方法。
最后,我们创建了MyClass
的实例my_obj
,并打印了my_obj.my_attr
和调用了my_obj.my_method()
。
__new__()方法接收到的参数依次是:
- 当前准备创建的类的对象
- 类的名字
- 类继承的父类集合
- 类的方法集合
给自定义的MyList增加一个add方法
# 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)
class MyList(list, metaclass=ListMetaclass):
pass
mylist = MyList()
mylist.append(0)
mylist.add(50)
print(f"列表中的内容为:", *mylist) # 输出:列表中的内容为: 0 50
定义完元类ListMetaclass后,在自定义类MyList中传入关键字参数metaclass。指示解释器创建Mylist时,通过ListMetaclass.__new__来创建。加上新的方法add后,返回修改后的定义。