将参数传递给基类构造函数还是使用实例变量?
所有从某个基类派生出来的类都必须定义一个叫做“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成为一个新式类。