@staticmethod可以被继承吗?

8 投票
2 回答
12331 浏览
提问于 2025-04-16 12:11

这个问题说得很清楚。我有一个抽象类,它在一个辅助函数里调用了一个静态方法,我希望子类只需要定义这个静态方法,然后就可以直接使用了。

我是不是可以用类似getattr的东西?或者我应该用@classmethod呢?

2 个回答

3

是的,如果你用 self 来调用方法,或者在类方法中用 cls,这都是可以的。

不过,我还是建议你使用类方法。这样做可以让实现代码查看类的属性,如果你将来有多个继承层级,这样可以让中间的类更容易处理事情。

我不太清楚你在方法里具体在做什么,所以可能类方法在实际使用中对你没有什么帮助。不过,使用它几乎没有什么成本,所以你不妨养成这个习惯。

5

像这样:

class A(object):
    def func(self):
        self.f()

class B(A):
    @staticmethod
    def f():
        print "I'm B"

测试:

>>> a=x.A()
>>> a.func()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "x.py", line 3, in func
    self.f()
AttributeError: 'A' object has no attribute 'f'
>>> b=x.B()
>>> b.func()
I'm B

A 单独使用是行不通的,它需要一个辅助函数来调用一个静态方法。B 定义了这个静态方法。如果我理解你的意思没错的话,这样是可以的……

撰写回答