在超类构造函数或子类构造函数中调用方法?

2 投票
4 回答
3824 浏览
提问于 2025-04-15 22:14

1. 将配置传递给 __init__ 方法,这个方法会隐式地调用 register

class Base:

    def __init__(self, *verbs):
        if not verbs:
          verbs = "get", "post"
        self._register(verbs)

    def _register(self, *verbs):
        pass


class Sub(Base):

    def __init__(self):
        super().__init__("get", "post", "put")

2. 在子类的 __init__ 方法中显式地调用 register

class Base:

    def __init__(self):
        self._register("get", "post")

    def _register(self, *verbs):
        pass


class Sub(Base):

    def __init__(self):
        self._register("get", "post", "put")

我使用的是 Python 3。

哪种方式更好或者更符合 Python 的风格?还是说这只是个人喜好问题?

4 个回答

0

在我看来,第二种方法更好。更“Pythonic”的做法是尽量让事情变得明确。这样你就不需要去查找父类的构造函数,看看它是怎么处理那些参数的……

0

如果所有从基类(也就是父类)扩展出来的东西都表现得一样,我个人会在基类的构造函数里调用。如果不是,行为各不相同的话,我就会在子类(也就是从基类派生出来的类)里调用...

至于什么更符合Python的风格——别盲目追随某种潮流,写出能正常工作的代码就行...

马丁

3

我觉得这些选项都不是很好。最接近的解决方案可能是:

class Base(object):

    def __init__(self):
        self._register("get", "post")


class Sub(Base):

    def __init__(self):
        super(Sub, self).__init__()
        self._register("put")

我也在想,是否把动词在类的层面上注册会更好。因为它们对于所有实例来说可能是一样的,那为什么要为每个实例单独注册呢?

撰写回答