【发布时间】:2021-09-24 02:15:55
【问题描述】:
当我运行下面的代码时,最后我得到了对父类 A 的引用,而我希望引用子类 B。
In [1]: class A:
...: def f():
...: print(__class__)
...:
In [2]: class B(A): pass
In [3]: B.f()
<class '__main__.A'>
我知道我可以做类似的事情
In [4]: class A:
...: def f(self):
...: print(self.__class__)
...:
In [5]: class B(A): pass
In [6]: B().f()
<class '__main__.B'>
但我想知道是否有什么方法可以去掉多余的括号。
【问题讨论】:
-
您为什么希望
B.f()这样做?它只是在 A 的类块中定义的一个函数。 -
@wim:有趣的是,它不只是一个函数;不合格的
__class__完全有效的事实是因为在A的class块中定义会改变f,而不是在A的class块中未定义的情况(它隐式地将其包装在一个伪造的闭包范围中,该范围提供__class__为A)。__class__是 OP 无法理解的魔法;我怀疑他们认为这是运行时魔术,而实际上(有点)定义时魔术(它更像是类定义时魔术而不是函数定义时魔术,但两者兼而有之)。 -
type(B.f)是函数,type(B().f)是方法。问题标题询问“父母的方法”,但问题主体不使用方法。一个在类块中没有定义参数并且没有用@staticmethod修饰的函数,首先是一件很奇怪的事情,所以我对OP在这里尝试做的事情有点茫然。 XY 问题? -
@wim:当然,但是 Python 新手(甚至对 Python 不太熟悉的人)经常混合使用这些术语。哎呀,在 Python 2 天里,
B.f实际上是一个方法(一个未绑定的方法,但与普通函数略有不同),因此在这种特殊情况下,较早的参考资料将它们混为一谈是合理的,特别是因为术语“方法”可以合理地描述在抽象类中定义的函数,即使它实际上还没有绑定到特定实例。 -
@wim:XY 问题是完全可能的。我猜他们放弃了任何参数,因为他们只想在这种无实例情况下使用它,并且给它任何参数会阻止他们甚至试图调用它。他们可能不知道
@staticmethod(如果他们知道,他们就会知道@classmethod,并且不需要问这个问题)。
标签: python class inheritance