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

Python 将参数传递给基类构造函数还是使用实例变量?,python,oop,parameters,constructor,python-3.x,Python,Oop,Parameters,Constructor,Python 3.x,从某个基类派生的所有类都必须定义一个名为“path”的属性。在duck类型的意义上,我可以依赖于子类中的定义: class Base: pass # no "path" variable here def Sub(Base): def __init__(self): self.path = "something/" 另一种可能性是使用基类构造函数: class Base: def __init__(self, path): self.p

从某个基类派生的所有类都必须定义一个名为“path”的属性。在duck类型的意义上,我可以依赖于子类中的定义:

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/")
我使用Python3.1

你喜欢什么?为什么?在Python 3.0+中有更好的方法吗?


我将带一个参数到基类的构造函数,就像在第二个示例中一样。因为这迫使从Base派生的类提供必要的path属性,它记录了这样一个事实,即类具有这样一个属性,并且需要派生类来提供它。如果没有它,您将依赖于在类的docstring中的某个地方声明(并读取)该属性,尽管在docstring中声明特定属性的含义肯定会有所帮助

在Python 2.6+中:
我不会使用以上两种方法;相反,我会使用:

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

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

换句话说,我需要在基类的构造函数中使用这样一个参数,因为它记录了这样一个事实,即所有此类类型都将拥有/使用/需要该特定参数,并且需要提供该参数。但是,我不会将super()用作,我也会通过从object(或其他一些新样式)类继承来创建一个基。

super()没有任何脆弱之处。。脆弱之处在于2.x语法,它在3.x中得到了修复(OP正在使用3.x,如
super()
调用所示),以及一般的多重继承。在Python3.x中,没有任何理由直接调用基类方法,
super()。\uu init(…)
语法从来没有更差过,而且通常更好,我猜迪蒙在用py3k@ThomasWouters:如果您使用具有不同构造函数签名的多继承和基类,您将如何使用super?将派生类的所有参数传递给所有基类看起来像是一种肮脏的黑客行为,依赖命名参数并让基类整理出它们需要的东西并没有多大好处。