Python Staticmethod 可以调用另一个本地方法吗?

Can Python Staticmethod Call Another Local Method?

在 Python 中,在 class 中,staticmethod 可以调用在同一个 class 中定义的另一个本地 function/method 吗?

我尝试了以下代码并收到一条错误消息,指出 foo1() 未定义。

class trialOne(object):

    @staticmethod
    def foo1():
        a = 3.1
        return a

    @staticmethod
    def foo():
        a = foo1()
        return a

obj = trialOne()
b = obj.foo()
class Tester:
    def local(self):
        print "I'm a local!"

    @staticmethod
    def another_stat():
        print "I'm a static!"

    @staticmethod
    def stat(inst):
        inst.local()
        Tester.another_stat()


t = Tester()
Tester.stat(t)

# Out:
# I'm a local!
# I'm a static!

是的,你可以!根据定义,实例方法需要一个实例与之关联,但只要您拥有该实例,就可以像往常一样调用本地方法。

为了更深入地探讨这个问题,self 这个词没有什么特别之处。这是一个和其他变量一样的变量。 class 的任何实例方法都必须将 class 的一个实例作为其第一个参数,并且约定调用该参数 self,但您可以轻松地使用任何其他名称.

如果这有助于您理解区别,则这两个语句在语义上是等价的:

t.local()

Tester.local(t)

第一个只是第二个的语法糖。第二种是使用 class 名称引用测试程序 class 的方法,然后将实例作为第一个参数传入。第一个简单地假装 localt 的一个字段并调用它,但是该调用被 Python 解释器转换为 Tester.local(t)

因此,调用静态方法的语法与 Tester.local(t) 相同,除了第一个参数 不必 必须是 class 的实例.

所以 classmethods 和 staticmethods 的调用方式是一样的,不同的是 class 方法 "knows" 它的来源是什么 class 。 class 方法的第一个参数始终是一个变量,其中包含调用它的 class。这样,如果方法是继承的,它就知道它来自哪个方法,而静态方法不知道。在您的评论中,您是这样说的:

@classmethod 
def stat(cls): 
    cls.another_stat()

在此示例中,cls 是一个变量,其中包含从中调用该方法的 class, 而不是 调用它的 class 实例。这就是为什么您可以使用 cls 调用静态方法的原因 - 因为它等同于 Tester