2010-04-28 12 views
8

Todas las clases derivadas de una cierta clase base tienen que definir un atributo llamado "ruta". En el sentido de la tipificación de pato que podía confiar en la definición de las subclases:Pasando el parámetro al constructor de la clase base o usando la variable de instancia?

class Base: 
    pass # no "path" variable here 

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

Otra posibilidad sería utilizar el constructor de la clase base:

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

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

que usar Python 3.1.

¿Qué preferirías y por qué? ¿Hay una mejor manera?

Respuesta

11

En Python 3.0 o superior:
Me gustaría ir con un parámetro al constructor de la clase base como la que tiene en el segundo ejemplo. Como esto fuerza a las clases que se derivan de Base a proporcionar la propiedad de ruta necesaria, que documenta el hecho de que la clase tiene dicha propiedad y que se requieren clases derivadas para proporcionarla. Sin él, usted estaría confiando en que esto se establezca (y lea) en algún lugar de las cadenas de documentos de su clase, aunque ciertamente ayuda también indicar en el documento lo que significa la propiedad en particular.

En Python 2.6+:
me gustaría utilizar ninguno de los anteriores; en cambio yo usaría:

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

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

En otras palabras, que requeriría un parámetro en el constructor de la clase base, ya que documenta el hecho de que todos estos tipos tendrán/uso/necesidad de ese parámetro en particular y que el parámetro necesita ser provieded Sin embargo, no usaría super() como super is somewhat fragile and dangerous in Python, y también haría que Base sea new-style class al heredar de la clase de objeto (o de algún otro estilo nuevo).

+5

No hay nada frágil sobre 'super()'. La fragilidad está en la sintaxis 2.x, que está fija en 3.x (que el OP está utilizando, como se muestra mediante la llamada 'super()'), y la herencia múltiple en general. No hay ninguna razón para llamar al método baseclass directamente en Python 3.x, la sintaxis 'super() .__ init (...)' nunca es peor y, a menudo, mejor. –

+0

juzgando por el uso de 'super', supongo que Deamon está usando py3k – SilentGhost

+0

@Thomas Wouters: ¿cómo usarías super si todas las clases de herencia múltiple y base con diferentes firmas de constructor? Pasar todos los argumentos de las clases derivadas a todas las clases base parece un truco sucio, confiar en los parámetros nombrados y dejar que las clases base resuelvan lo que necesitan no es mucho mejor. – kriss

Cuestiones relacionadas