2012-02-06 26 views
5

¿Hay alguna manera de lograr algo como esto? Yo trabajo en Python, pero no estoy seguro de si hay una manera de hacerlo en cualquier lenguaje de programación ...herencia en atributos de clase (python)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

Yo sé que no puedo llamar directamente __class__. Es solo un ejemplo, porque me gustaría algo como referencia a la clase en sí, porque quiero que la clase infantil actúe de forma diferente en función de su atributo_clase.

Y luego supuesta salida debe ser como este:

> Parent.class_method() 
"parent" 
> Child.class_method() 
"child" 

sé la misma técnica se puede lograr a través de las instancias. Pero no quiero crear instancias, porque a veces el código dentro del método __init__ puede ser largo y exigente y si quisiera llamar al class_method a menudo, tendría que crear muchas instancias usadas solo para esta llamada a un método. Y porque class_attribute y class_method son estáticos y no serán modificados por instancias.

+0

¿Estás hablando simplemente de funciones 'estáticas'? – Tigran

Respuesta

9

Er, suena como usted quiere una classmethod, lo cual no es sorprendente que se hace con la classmethod decorador:

class Parent(object): 
    class_attribute = "parent" 

    @classmethod 
    def class_method(cls): 
     print cls.class_attribute 

class Child(Parent): 
    class_attribute = "child" 


>>> Parent.class_method() 
parent 
>>> Child.class_method() 
child 

O , como señala bgporter, puedes hacerlo directamente con los atributos, sin necesidad de ningún método.

+0

sí, esto es exactamente lo que quería, ¡muchas gracias! – davekr

+0

pero teniendo en cuenta la documentación: "si se llama a un método de clase para una clase derivada, el ** objeto de clase derivado ** se pasa como el primer argumento implícito", ¿significa que el objeto de clase derivado se creará de cualquier forma? Porque OP dice que le gustaría evitar la instancia constructon. – Tigran

+0

Quería llamar al método, porque el código en el método podría hacer algo más complicado que simplemente imprimir atributos. Pensé que hacer un modelo más fácil sería una explicación más fácil de lo que quería ... así que @classmethod es una solución – davekr

3

Simplemente funciona en Python, con o sin la creación de instancias:

>>> class Parent(object): 
... attribute = "parent" 
... 
>>> class Child(Parent): 
... attribute = "child" 
... 
>>> p = Parent() 
>>> p.attribute 
'parent' 
>>> c = Child() 
>>> c.attribute 
'child' 
>>> Parent.attribute 
'parent' 
>>> Child.attribute 
'child' 
>>> 
Cuestiones relacionadas