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

Han*_*ans 7 python static-methods

在Python中,在一个类中,是否可以在同一个类中定义的另一个本地函数/方法上调用static方法?

我尝试了以下代码并获得了一条错误消息,说foo1()未定义.

class trialOne(object):

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

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

obj = trialOne()
b = obj.foo()
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 14

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!
Run Code Online (Sandbox Code Playgroud)

是的你可以!根据定义,实例方法需要一个实例来关联它们,但只要您拥有该实例,就可以像通常那样调用本地方法.

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

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

t.local()

Tester.local(t)

第一个是第二个的语法糖.第二种是使用类名引用Tester类的方法,然后将实例作为第一个参数传递.第一个简单地假装local是一个字段t并调用它,但该调用Tester.local(t)由Python解释器转换.

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

所以classmethods和staticmethods以相同的方式被调用,但不同之处在于类方法"知道"它来自哪个类.类方法的第一个参数始终是一个变量,它包含从中调用的类.这样,如果继承该方法,它就知道它来自哪个方法,静态方法不知道.在你的评论中,你这样说:

@classmethod 
def stat(cls): 
    cls.another_stat()
Run Code Online (Sandbox Code Playgroud)

在这个例子中,cls是包含类,该方法正在从,称为可变不是其正被从称为类的一个实例.这就是为什么你可以调用静态方法cls- 因为它等同于Tester