在Python中将一个类的实例子类化的目的是什么?下面是一个例子:
class A:
def __init__(*args): print(args)
base = A()
class Test(base): pass
这段代码在Python下正常工作,但是base
是类A
(1)的实例为什么我们需要子类化一个类的实例?是否与元类相关?
从这个问题:当您从Python中的模块而不是类中固有时会发生什么?
我理解Test(base)
将变成type(base).__init__
, (2) 这是否发生在定义时,当类被定义时? (3) Python如何知道/决定base
是一个类的实例?是否因为type(base)
不返回type
?
Python实际上使用type(base)(classname, bases, body)
来生成类对象。这是正常的元类调用(除非类直接指定了一个特定的元类)。
对于实例(或模块,基本上也是一个实例),这意味着调用类__new__
静态方法来生成一个新实例,并在该新实例上调用__init__
。因此,对于class Test(base): pass
语法,当Python执行class
语句时,实际上是创建了A
的一个新实例。
这不是真正的'定义时间';在Python代码中没有这样的阶段。Python加载模块的字节码,并在第一次导入模块时执行它。在模块顶部的类语句(而不是在函数内部)在那个时候执行。就是在那个时候,type(base)(...)
调用被执行,是的。
Python不"知道"或"决定"关于基类的任何事情。Python的哲学是信任用它编写代码的开发人员。假设您知道自己在做什么,并且基类被视为会正确响应。由于type(base)(....)
没有引发异常,Python只是继续。
你可以使用任何可调用的元类,真的