我无法找到是否可以从Python中的静态方法调用非静态方法.
谢谢
编辑:好的.静电静电怎么样?我可以这样做:
class MyClass(object):
@staticmethod
def static_method_one(cmd):
...
@staticmethod
def static_method_two(cmd):
static_method_one(cmd)
Run Code Online (Sandbox Code Playgroud)
Len*_*bro 11
这完全可能,但不是很有意义.考虑以下课程:
class MyClass:
# Normal method:
def normal_method(self, data):
print "Normal method called with instance %s and data %s" % (self, data)
@classmethod
def class_method(cls, data):
print "Class method called with class %s and data %s" % (cls, data)
@staticmethod
def static_method(data):
print "Static method called with data %s" % (data)
Run Code Online (Sandbox Code Playgroud)
显然,我们可以用预期的方式调用它:
>>> instance = MyClass()
>>> instance.normal_method("Success!")
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data Success!
>>> instance.class_method("Success!")
Class method called with class __main__.MyClass and data Success!
>>> instance.static_method("Success!")
Static method called with data Success!
Run Code Online (Sandbox Code Playgroud)
但也要考虑这个:
>>> MyClass.normal_method(instance, "Success!")
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data Success!
Run Code Online (Sandbox Code Playgroud)
语法instance.normal_method()几乎只是一个"捷径" MyClass.normal_method(instance).这就是为什么在方法中存在这个"自我"参数,以传递自我.名字self不是神奇的,你可以随意调用它.
使用静态方法完全可以实现相同的技巧.您可以使用实例作为第一个参数调用普通方法,如下所示:
@staticmethod
def a_cool_static_method(instance, data):
print "Cool method called with instance %s and data %s" % (instance, data)
MyClass.normal_method(instance, data)
MyClass.class_method(data)
MyClass.static_method(data)
>>> instance.a_cool_static_method(instance, "So Cool!")
Cool method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data So Cool!
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data So Cool!
Class method called with class __main__.MyClass and data So Cool!
Static method called with data So Cool!
Run Code Online (Sandbox Code Playgroud)
所以答案是肯定的,你可以从静态方法中获取非静态方法.但前提是您可以将实例作为第一个参数传入.所以你要么必须从静态方法内部生成它(在这种情况下,你可能最好使用类方法)或传入它.但是如果你传入实例,你通常只能使它成为一个普通的方法.
所以你可以,但是,这是毫无意义的.
那就引出了一个问题:你为什么这么想?
在其他答案和您的后续问题之后-关于静态方法中的静态方法:是的,您可以:
>>> class MyClass(object):
@staticmethod
def static_method_one(x):
return MyClass.static_method_two(x)
@staticmethod
def static_method_two(x):
return 2 * x
>>> MyClass.static_method_one(5)
10
Run Code Online (Sandbox Code Playgroud)
而且,如果您好奇的话,对于class方法中的class方法也可以(很容易在解释器中测试这些东西-所有这些都是从2.5.2中的Idle剪切和粘贴的) [**EDITED to make correction in usage pointed out by others**]:
>>> class MyClass2(object):
@classmethod
def class_method_one(cls, x):
return cls.class_method_two(x)
@classmethod
def class_method_two(cls, x):
return 2 * x
>>> MyClass2.class_method_one(5)
10
Run Code Online (Sandbox Code Playgroud)