将类的实例用作超级/基类的目的是什么?

时间:2016-09-06 19:40:30

标签: python class inheritance python-internals

在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吗?

1 个答案:

答案 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只是继续。

你可以使用任何可以作为元类调用的东西。