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