完全有可能,但意义不大。思考以下课程:
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)
显然,我们可以按预期的方式调用它:
>>> 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!
但也要考虑一下:
>>> MyClass.normal_method(instance, "Success!")
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data Success!
语法instance.normal_method() 几乎只是MyClass.normal_method(instance) 的“快捷方式”。这就是为什么在方法中有这个“self”参数,用来传入self。 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!
所以答案是肯定的,你可以从静态方法中调用非静态方法。但前提是您可以将实例作为第一个参数传递。因此,您要么必须从静态方法内部生成它(在这种情况下,使用类方法可能会更好)或将其传入。但如果传入实例,通常可以将其设为普通方法。
所以你可以,但是,这是毫无意义的。
这就引出了一个问题:你为什么要这样做?