在Python中从静态方法调用非静态方法

时间:2009-09-06 12:20:29

标签: python oop

我无法找到是否可以从Python中的静态方法调用非静态方法。

由于

编辑: 好。静电静电怎么样?我可以这样做:

class MyClass(object):

    @staticmethod
    def static_method_one(cmd):
    ...

    @staticmethod
    def static_method_two(cmd):
        static_method_one(cmd)

5 个答案:

答案 0 :(得分: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)

显然,我们可以用预期的方式调用它:

>>> 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)的“捷径”。这就是为什么在方法中存在这个“自我”参数,以传递自我。自我这个名字并不神奇,你可以随意调用它。

使用静态方法完全可以实现相同的技巧。您可以使用实例作为第一个参数调用普通方法,如下所示:

    @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!

所以答案是肯定的,你可以从静态方法中获取非静态方法。但前提是您可以将实例作为第一个参数传入。所以你要么必须从静态方法内部生成它(在这种情况下你可能最好用类方法)或传入它。但是如果你传入实例,你通常只能使它成为一个普通的方法。

所以你可以,但是,这是毫无意义的。

那就引出了一个问题:你为什么要这样做?

答案 1 :(得分:4)

在其他答案和您的后续问题之后 - 关于静态方法的静态方法:是的,您可以:

>>> 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

而且,如果你很好奇,那么类方法的类方法也是如此(在解释器中很容易测试这些东西 - 所有这些都是从2.5.2中的Idle中剪切和粘贴的)[**EDITED to make correction in usage pointed out by others**]:< / p>

>>> 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

答案 2 :(得分:4)

使用类方法,而不是静态方法。为什么还把它放在一个班级?

class MyClass(object):

    @classmethod
    def static_method_one(cls, cmd):
    ...

    @classmethod
    def static_method_two(cls, cmd):
        cls.static_method_one(cmd)

答案 3 :(得分:2)

在静态方法中,您没有自我实例:您在哪个对象上调用非静态方法?当然,如果你有一个实例,你可以在上面调用方法。

答案 4 :(得分:0)

不可能使用该类的实例。您可以向方法f(x, y, ..., me)添加一个参数,并使用me作为对象来调用非静态方法。