2010-04-28 95 views
8

从某一基类派生的类都定义被称为“路径”的属性。在鸭打字的感觉,我可以在子类中依赖的定义:将参数传递给基类构造函数或使用实例变量?

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。

你会喜欢,为什么?有没有更好的办法?

回答

11

在Python 3.0+:
我将与参数基类的构造函数去喜欢你的第二个例子都有。因为这会迫使从Base派生出的类提供必要的路径属性,该属性记录了类有这样的属性以及派生类需要提供它的事实。没有它,你将依赖于这个被说(读)在类的文档字符串的地方,虽然它的确帮助到什么特殊的属性意味着文档字符串也状态。

在Python 2.6+中:
我会同时使用以上;相反,我会用:

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

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

换句话说,我需要在基类的构造函数中这样的参数,因为它记录了一个事实,即所有这些类型都会有/使用/需要特定的参数,该参数需要被提供。不过,我不会用超()作为super is somewhat fragile and dangerous in Python,我也会使基地一new-style class通过继承从对象(或从其他一些新的样式)类。

+5

没有什么脆弱关于'超()'。脆弱性在2.x语法中,它在3.x(OP所使用的,如super()调用所示)中是固定的,并且通常是多重继承。没有任何理由可以直接在Python 3.x中调用baseclass方法,“super().__ init(...)”语法永远不会更糟,通常也更好。 – 2010-04-28 10:04:18

+0

通过使用'super'的情况来看,我猜想,守护进程正在使用py3k – SilentGhost 2010-04-28 10:04:25

+0

@Thomas武泰:你会如何使用超级如果你所有的多重继承和基类具有不同的构造函数签名?将派生类的所有参数传递给所有基类看起来就像是一个肮脏的黑客攻击,依赖于命名参数,并让基类理清他们所需要的东西并不是太好。 – kriss 2014-04-14 10:04:24

相关问题