类实例化(元类)
这节的确是太难了点……新手快跑!!
上一篇我们将到,Python 中一切皆对象。所以类本身(不是实例化出来的对象)本身也是一个对象。类的类型是 Type。
type(对象) 可以查看对象的类型。
运行代码
class A:
...
print(A) # 输出:<class '__main__.A'>
print(type(A)) # 输出:<class 'type'>既然类是 type 类型的,我们也可以通过实例化 type 来动态建立一个类。
先看看 type 定义类时初始化函数的重载:
def __init__(self, __name: str, __bases: tuple[type, ...],
__dict: dict[str, Any], **kwds: Any) -> None:
...type(名字, 继承关系(被继承的父类), 一个包含着属性和方法的字典) 可以建立一个类。
运行代码
Student = type('Student', (object, ), {'name': 'test'})
print(Student().name) # 输出:test既然我们可以通过实例化 type 来建立类,我们也可以通过继承 type 来获得一个可以用来建立类的类。这种类称为元类。
class MyMetaclass(type):
def __new__(cls, name, bases, dict):
return type.__new__(cls, name, bases, dict)我们可以通过该元类来建立类。
class MyMetaclass:
...
class MyClass(metaclass=MyMetaclass):
...
# 上面两行等价于下面一行
MyClass = MyMetaclass('MyClass', (object, ), {})所以说,建立一个类 class MyClass: ... 相当于 class MyClass(object, metaclass=type): ...。
一个例子:
运行代码
class MyMetaclass(type):
def __new__(cls, name, bases, dict):
def foo(self, bar):
return bar - 1
dict['test'] = foo
return type.__new__(cls, name, bases, dict)
class MyClass(metaclass=MyMetaclass):
...
print(MyClass().test(1)) # 输出:2版权所有
版权归属:异想之旅 | YuzhenQin