27

这很烦人:

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

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

有没有办法在通话中不命名 MyClass 来完成这项工作?也就是说,我可以foo()在最后一行说吗?

4

4 回答 4

18

没有办法使用foo和得到你想要的。没有隐式的类范围,foo本地或全局也是如此,这两者都不是你想要的。

您可能会发现 classmethods 更有用:

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

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

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

于 2013-01-15T15:12:33.973 回答
1

不可能。这是语言设计的问题。将其与 C++ 进行比较,其中this(与 Python 相同self;在 Python 中您必须编写self.var,在 C++ 中您可以编写 just var,not this->var)和自己的类在成员函数中默认使用,您可能会看到有时这很好,而且有时这很烦人。唯一可能的是习惯该功能。

于 2013-01-15T15:18:35.700 回答
0

你'变量化'类名。这不会删除,但会缩短名称。

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

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

c = MyClass
于 2020-09-29T10:23:24.657 回答
-1

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

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()
于 2013-01-15T15:24:45.043 回答