静态方法时获取调用者函数对象

问题描述 投票:0回答:1

我以为我懂一点 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'

注意:与如何获取调用者函数的地址?相比,这个问题描述了一个更困难的情况(在我看来)。事实上,使用全局迭代可以轻松解决所提到的问题(见下文)。

这是我尝试过的:

  1. 如果我使用

    inspect
    模块,我可以将调用者函数的名称作为 str 访问(而不是调用者函数的对象本身),因此我无法使用
    __qualname__

  2. 如果我尝试迭代全局变量以查看哪个全局对象具有名为“f”的方法,我会得到两个答案,但无法在两者之间做出决定。

  3. 我认为属性“cls”应该在

    locals
    中,就像“self”一样,如果这些是常规函数(不是静态方法),如果是这样,我可以通过
    inspect.stack()[1][0].f_locals['cls']
    到达该类,但“cls”不存在。

有什么想法吗?

python static-methods python-inspect
1个回答
0
投票

你的第三点描述了一个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()
© www.soinside.com 2019 - 2024. All rights reserved.