gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:25:43 28 4
gpt4 key购买 nike

在 Python 中,在一个类中,静态方法可以调用在同一类中定义的另一个局部函数/方法吗?

我尝试了以下代码并收到一条错误消息,指出 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 这个词没有什么特别之处。这是一个和其他变量一样的变量。类的任何实例方法都必须接受该类的一个实例作为其第一个参数,并且通常将该参数称为 self,但您也可以轻松地使用任何其他名称。

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

t.local()

Tester.local(t)

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

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

所以类方法和静态方法的调用方式相同,但区别在于类方法“知道”它来自哪个类。类方法的第一个参数始终是一个变量,其中包含调用它的类。这样,如果方法是继承的,它就知道它来自哪个方法,而静态方法不知道。在您的评论中,您是这样说的:

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

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

关于python - Python Staticmethod 可以调用另一个本地方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38732287/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com