【问题标题】:Python: possible to call static method from within class without qualifying the namePython:可以在不限定名称的情况下从类中调用静态方法
【发布时间】:2012-12-29 17:24:31
【问题描述】:

这很烦人:

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

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

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

【问题讨论】:

  • 不。你想达到什么目的?
  • 类方法将类作为第一个参数因为它使用了类bar 应该是 @classmethod

标签: python class namespaces


【解决方案1】:

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

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

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

c = MyClass

【讨论】:

    【解决方案2】:

    您可以通过创建模块级函数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()
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        没有办法使用foo 得到你想要的。没有隐式的类作用域,所以 foo 要么是本地的,要么是全局的,这两者都不是你想要的。

        您可能会发现类方法更有用:

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

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

        【讨论】:

        • 当你不使用这个类时,为什么要把foo 变成classmethod?我会让foo 一个staticmethodbar 一个classmethod (就像你做的那样)。
        猜你喜欢
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 2011-08-26
        • 1970-01-01
        相关资源
        最近更新 更多