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 的方法,然后将实例作为第一个参数传入。第一个简单地假装 local
是 t
的一个字段并调用它,但是该调用被 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
在 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 的方法,然后将实例作为第一个参数传入。第一个简单地假装 local
是 t
的一个字段并调用它,但是该调用被 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