将 class 的实例用作 super/base class 的目的是什么?
What is the purpose of using instance of a class as a super/base class?
在 Python 中子 class 一个 class 实例的目的是什么?这是一个例子:
class A:
def __init__(*args): print(args)
base = A()
class Test(base): pass
这段代码在Python下可以正常运行,但是base
是class的一个实例A
(1)为什么我们需要sub class class? 的一个实例 它与 metaclasses 相关吗?
来自这个问题:
我知道 Test(base)
将变为 type(base).__init__
,(2) 这是否发生在定义时,当定义 class 时? (3) Python know/decide 怎么知道 base
是一个 class 的实例?是因为 type(base)
不是 return type
吗?
Python 实际上使用 type(base)(classname, bases, body)
来生成 class 对象。这是正常的 metaclass 调用(除非 class 直接指定特定的 metaclass)。
对于实例(或模块,基本上也是一个实例),这意味着调用class __new__
静态方法来生成一个新实例,并在该新实例上调用 __init__
。因此,对于您的 class Test(base): pass
语法,当 Python 执行 class
语句时,您实际上是在创建 A
的新实例。
这不是真的'definition time'; Python 代码中没有这样的阶段。 Python 加载模块的字节码并在第一次导入时执行它。 Class 模块顶部的语句(因此不在函数内部)在那个时候执行。正是在那时执行了 type(base)(...)
调用,是的。
Python 没有 'know' 或 'decide' 任何关于基础 class 的东西。 Python 的理念是信任在其中编写代码的开发人员。假设您知道自己在做什么,并且基本 classes 只是被视为它们会正确响应。由于 type(base)(....)
没有引发异常,Python 只是继续。
您可以使用任何可调用的元数据class,真的。
在 Python 中子 class 一个 class 实例的目的是什么?这是一个例子:
class A:
def __init__(*args): print(args)
base = A()
class Test(base): pass
这段代码在Python下可以正常运行,但是base
是class的一个实例A
(1)为什么我们需要sub class class? 的一个实例 它与 metaclasses 相关吗?
来自这个问题:
我知道 Test(base)
将变为 type(base).__init__
,(2) 这是否发生在定义时,当定义 class 时? (3) Python know/decide 怎么知道 base
是一个 class 的实例?是因为 type(base)
不是 return type
吗?
Python 实际上使用 type(base)(classname, bases, body)
来生成 class 对象。这是正常的 metaclass 调用(除非 class 直接指定特定的 metaclass)。
对于实例(或模块,基本上也是一个实例),这意味着调用class __new__
静态方法来生成一个新实例,并在该新实例上调用 __init__
。因此,对于您的 class Test(base): pass
语法,当 Python 执行 class
语句时,您实际上是在创建 A
的新实例。
这不是真的'definition time'; Python 代码中没有这样的阶段。 Python 加载模块的字节码并在第一次导入时执行它。 Class 模块顶部的语句(因此不在函数内部)在那个时候执行。正是在那时执行了 type(base)(...)
调用,是的。
Python 没有 'know' 或 'decide' 任何关于基础 class 的东西。 Python 的理念是信任在其中编写代码的开发人员。假设您知道自己在做什么,并且基本 classes 只是被视为它们会正确响应。由于 type(base)(....)
没有引发异常,Python 只是继续。
您可以使用任何可调用的元数据class,真的。