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