将参数传递给基类构造函数还是使用实例变量?

10 投票
1 回答
20978 浏览
提问于 2025-04-15 22:07

所有从某个基类派生出来的类都必须定义一个叫做“path”的属性。根据鸭子类型的概念,我可以依赖子类中的定义:

class Base:
    pass # no "path" variable here

def Sub(Base):
    def __init__(self):
        self.path = "something/"

另一种可能性是使用基类的构造函数:

class Base:
    def __init__(self, path):
        self.path = path

def Sub(Base):
    def __init__(self):
        super().__init__("something/")

我使用的是Python 3.1。

你更喜欢哪种方式,为什么?有没有更好的方法?

1 个回答

14

在Python 3.0及以上版本:
我建议在基类的构造函数中添加一个参数,就像你在第二个例子中那样。这样做可以强制从基类派生的类提供必要的路径属性,这样就明确了这个类有这样的属性,并且派生类必须提供它。如果没有这个要求,你就得依赖于在类的文档字符串中某个地方说明这一点,虽然在文档字符串中说明这个特定属性的含义也是很有帮助的。

在Python 2.6及以上版本:
我不会使用上面提到的任何一种方法;相反,我会使用:

class Base(object):
    def __init__(self,path):
        self.path=path;

class Sub(Base):
    def __init__(self):
       Base.__init__(self,"something/")

换句话说,我会在基类的构造函数中要求这样的参数,因为这可以说明所有这样的类型都会有/使用/需要这个特定的参数,并且这个参数是必须提供的。不过,我不会使用super(),因为在Python中,super有点脆弱和危险,我还会通过从object(或其他新式类)继承来使Base成为一个新式类

撰写回答