2012-07-21 18 views
6

Empecé a aprender Python en los últimos días, y mientras exploro la programación orientada a objetos, tengo problemas. Estoy usando Eclipse mientras ejecuto el complemento pydev, estoy usando python 3.3 beta y estoy usando un sistema de Windows de 64 bits.¿Cómo extender apropiadamente otras clases en Python? (python v3.3)

Puedo inicializar una clase fina y usar cualquier método dentro de ella, siempre que no trate de extender la superclase (cada clase he codificado en un archivo fuente diferente) Por ejemplo, el siguiente código compila y funciona bien

class pythonSuper: 
    string1 = "hello" 
    def printS(): 
     print pythonSuper.string1 

y el código para acceder y ejecutarlo ...

from stackoverflow.questions import pythonSuper 
class pythonSub: 
    pysuper = pythonSuper.pythonSuper() 
    pysuper.printS() 

Como dije, eso funciona. El siguiente código no es

class pythonSuper: """Same superclass as above. unmodified, except for the spacing""" 
string1 = "hello" 
def printS(self): 
    print(pythonSuper.string1) 

Bueno, eso no es del todo cierto. La superclase está absolutamente bien, al menos que yo sepa. Es la subclase que Weirds cabo

from stackoverflow.questions import pythonSuper 
class pythonSub(pythonSuper): 
    pass 

pythonObject = pythonSub() 
pythonSub.pythonSuper.printS() 

cuando la subclase se ejecuta Eclipse imprime este error

Traceback (most recent call last): 
    File "C:\Users\Anish\workspace\Python 3.3\stackoverflow\questions\pythonSub.py",   
    line 7, in <module> 
class pythonSub(pythonSuper): 
TypeError: module.__init__() takes at most 2 arguments (3 given) 

no tengo idea de lo que está pasando. He estado aprendiendo Python de los tutoriales de newboston, pero están desactualizados (creo que su código de tutorial usa la versión 2.7 de Python). También codifica en IDLE, lo que significa que sus clases están todas contenidas en un archivo. El mío, sin embargo, está codificado en archivos propios. Eso significa que no tengo idea de si los errores de código que obtengo son el resultado de una sintaxis obsoleta o mi falta de conocimiento sobre este idioma. Pero yo divago. Si alguien puede publicar con una solución y/o explicación de por qué el código está fallando y qué podría hacer para solucionarlo. Una explicación sería preferida. Prefiero saber qué estoy haciendo mal para poder evitar y solucionar el problema en situaciones similares a las de copiar y pegar código y ver que funciona. Gracias, y espero sus respuestas

Respuesta

0

pythonSuper se refiere al módulo, no a la clase.

class pythonSub(pythonSuper.pythonSuper): 
    pass 
+0

gracias, pero ahora está publicando este error Traza (última llamada más reciente): Archivo "C: \ Users \ Anish \ workspace \ Python 3.3 \ stackoverflow \ questions \ pythonSub.py ", línea 11, en pythonSub.pythonSuper.printS() AttributeError: type object 'pythonSub' no tiene atributo 'pythonSuper' y no quiero molestar a nadie, pero ¿por qué? – pipsqueaker117

+3

¿Por qué esperarías? es para? pythonSub está extendiendo pythonSuper, que no lo contiene. 'printS' es heredado, y usted accede directamente a través de su instancia de pythonSub. –

+0

@DanielRoseman Lo siento, eso voló un poco sobre mi cabeza. ¿Podría explicarlo en , um, lenguaje novato? (Alternativamente, podría vincularme a una página donde podría aprender todo esto). – pipsqueaker117

3

que corrió su código, aunque con algunas modificaciones y funciona perfectamente. Aquí está mi código:

pythonSuper:

class pythonSuper: 
    string1 = 'hello' 
    def printS(self): 
     print(self.string1) 

principal:

from pythonSuper import pythonSuper as pySuper 

class pythonSub(pySuper): 
    pass 

pythonObject = pythonSub() 
pythonObject.printS() 

NOTA: El cambio que he realizado en su código es el siguiente:

En su código , ha escrito pythonSub.pythonSuper.printS() que no es correcto, porque a través de pythonSub ya admite un metodo printS() d, heredado directamente de la superclase. Entonces no hay necesidad de referirse explícitamente a la superclase en esa declaración. La afirmación de que usé para sustituir la ya mencionada, pythonObject.printS(), parece haber abordado este problema.

+0

Eso me da el error Traza (última llamada más reciente): Archivo "C: \ Users \ Anish \ workspace \" Python 3.3 \ stackoverflow \ questions \ pythonSub.py ", línea 8, en clase pytho nSub (pySuper): TypeError: module .__ init __() toma como máximo 2 argumentos (3 dados) Intenté copiar y pegar el código (con mi propio nombre de paquete), pero el resultado fue el error anterior. Estoy empezando a pensar que es una sintaxis de Python 3.3 porque dos soluciones ya han fallado (en el sentido de que el programa no se ejecutó correctamente), pero podría estar totalmente fuera de la marca – pipsqueaker117

+0

. Publique el código y el error para mí. más capaz de ayudarte. Creo que es un error que cometiste en tu versión del código, escribí lo anterior en Python 3.3 y funcionó muy bien. – NlightNFotis