2012-02-06 2 views
5

C'è un modo per realizzare qualcosa di simile? Io lavoro in Python, ma non sono sicuro se c'è un modo per farlo in qualsiasi linguaggio di programmazione ...ereditarietà sugli attributi di classe (python)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

So che non posso chiamare __class__ direttamente. È solo un esempio, perché vorrei qualcosa di simile alla classe stessa, perché voglio che la classe figlio agisca in modo diverso in base al suo attributo class_.

E poi supposto uscita dovrebbe essere simile a questo:

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

So che la stessa tecnica può essere realizzare attraverso le istanze. Ma non voglio creare istanze, perché a volte il codice all'interno del metodo __init__ potrebbe essere lungo e impegnativo e se volessi chiamare lo class_method spesso, dovrei creare molte istanze usate solo per questa chiamata di un metodo. E poiché class_attribute e class_method sono statici e non verranno modificati dalle istanze.

+0

stai parlando semplicemente di funzioni 'statiche'? – Tigran

risposta

9

Er, suona come si desidera una classmethod, che non a caso è fatto con l'classmethod decoratrice:

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 

Or , come sottolinea bgporter, puoi farlo direttamente con gli attributi, senza alcun bisogno di metodi.

+0

sì, questo è esattamente quello che volevo, grazie mille! – davekr

+0

ma considerando la documentazione: "se viene chiamato un metodo di classe per una classe derivata, l'oggetto di classe ** derivato ** viene passato come primo argomento implicito", significa che l'oggetto classe derivata verrà creato in qualsiasi modo? Perché OP dice che vorrebbe evitare il costrutto dell'istanza. – Tigran

+0

Ho voluto chiamare il metodo, perché il codice nel metodo potrebbe effettivamente fare qualcosa di più complicato, quindi basta stampare gli attributi. Anche se fare un exmaple più facile renderebbe più facile la spiegazione di ciò che volevo ... quindi @classmethod è una soluzione – davekr

3

Funziona proprio in Python, con o senza le istanze creando:

>>> 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' 
>>>