本文来自异想之旅公开发布的Python教程,原文地址:https://www.yuque.com/yxzl/python
这节的确是太难了点……新手快跑!!
上一篇我们将到,Python 中一切皆对象。所以类本身(不是实例化出来的对象)本身也是一个对象。类的类型是 Type
。
type(对象)
可以查看对象的类型。
class A:
...
print(A) # 输出:
print(type(A)) # A 的类型 # 输出:
既然类是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):
dict['test'] = lambda self, x: x + 1
# lambda 匿名函数,具体请见《函数(二)》章节
# 相当于下面的写法
def foo(self, bar):
return bar - 1
dict['test2'] = foo
return type.__new__(cls, name, bases, dict)
class MyClass(metaclass=MyMetaclass):
...
print(MyClass().test(1)) # 输出:2