Python: possible to call static method from within class without qualifying the name

前端 未结 4 1174
伪装坚强ぢ
伪装坚强ぢ 2021-01-01 11:07

This is annoying:

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

    @staticmethod
    def bar():
        MyClass.foo()
相关标签:
4条回答
  • 2021-01-01 11:46

    You 'variable-ize' the class name. This will not remove, but shorten the name.

    class MyClass:
        @staticmethod
        def foo():
            print "hi"
    
        @staticmethod
        def bar():
            c.foo()
    
    c = MyClass
    
    0 讨论(0)
  • 2021-01-01 11:48

    You can do something hacky by making a module level function foo and then adding it to the class namespace with 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()
    
    0 讨论(0)
  • 2021-01-01 12:05

    Not possible. It is a question of language design. Compare that to C++, where both this (the same as Python self; in Python you have to write self.var, in C++ you may write just var, not this->var) and own class are used by default in member functions, and you will probably see that sometimes that's good and sometimes that's annoying. The only thing possible is to get used to that feature.

    0 讨论(0)
  • 2021-01-01 12:08

    There is no way to use foo and get what you want. There is no implicit class scope, so foo is either a local or a global, neither of which you want.

    You might find classmethods more useful:

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

    This way, at least you don't have to repeat the name of the class.

    0 讨论(0)
提交回复
热议问题