我以为我懂一点 Python,但后来我被这个问题难住了(下面是一个精炼形式):
class A:
@staticmethod
def f():
print('what code should be here?')
class B:
@staticmethod
def f():
A.f()
class C:
@staticmethod
def f():
A.f()
B.f() # I want this to print 'B'
C.f() # I want this to print 'C'
注意:与如何获取调用者函数的地址?相比,这个问题描述了一个更困难的情况(在我看来)。事实上,使用全局迭代可以轻松解决所提到的问题(见下文)。
这是我尝试过的:
如果我使用
inspect
模块,我可以将调用者函数的名称作为 str 访问(而不是调用者函数的对象本身),因此我无法使用 __qualname__
。
如果我尝试迭代全局变量以查看哪个全局对象具有名为“f”的方法,我会得到两个答案,但无法在两者之间做出决定。
我认为属性“cls”应该在
locals
中,就像“self”一样,如果这些是常规函数(不是静态方法),如果是这样,我可以通过inspect.stack()[1][0].f_locals['cls']
到达该类,但“cls”不存在。
有什么想法吗?
你的第三点描述了一个class方法,而不是静态方法。
class C:
@classmethod
def foo(cls):
print(cls)
c1 = C()
c2 = C()
# All three bind the class C to the cls parameter.
c1.foo()
c2.foo()
C.foo()