Python:可以在类中调用静态方法而无需限定名称

时间:2013-01-15 15:11:14

标签: python class namespaces

这很烦人:

class MyClass:
    @staticmethod
    def foo():
        print "hi"

    @staticmethod
    def bar():
        MyClass.foo()

有没有办法让这项工作没有在通话中命名MyClass?即所以我可以在最后一行说foo()

4 个答案:

答案 0 :(得分:18)

无法使用foo并获得您想要的内容。没有隐式的类范围,因此foo是本地的或全局的,都不是你想要的。

您可能会发现classmethod更有用:

class MyClass:
    @classmethod
    def foo(cls):
        print "hi"

    @classmethod
    def bar(cls):
        cls.foo()

这样,至少你不必重复该类的名称。

答案 1 :(得分:1)

不可能。这是语言设计的问题。将其与C ++进行比较,其中this(与Python self相同;在Python中,您必须编写self.var,在C ++中,您可以只编写var,而不是{{默认情况下,在成员函数中使用1}}}和自己的类,你可能会看到有时这很好,有时候很烦人。唯一可能的是习惯这个功能。

答案 2 :(得分:0)

您可以“可变”类名。这不会删除,但会缩短名称。

class MyClass:
    @staticmethod
    def foo():
        print "hi"

    @staticmethod
    def bar():
        c.foo()

c = MyClass

答案 3 :(得分:-1)

你可以通过创建模块级函数foo,然后使用staticmethod将其添加到类命名空间来做一些hacky:

def foo():
    print "hi"

class MyClass(object):
    foo = staticmethod(foo)

    @classmethod
    def bar(cls):
        return cls.foo()

    def baz(self):
        return foo()


c = MyClass()
c.bar()
c.baz()

MyClass.bar()
MyClass.foo()