2012-02-06 25 views
5

Böyle bir şeyi başarmanın bir yolu var mı? Sınıf özniteliklerinde kalıtım (python)

class Parent(): 
    class_attribute = "parent" 

    @staticmethod 
    def class_method(): 
     print __class__.class_attribute 

class Child(Parent): 
    class_attribute = "child" 

Ben doğrudan __class__ arayamam biliyorum ... Python içinde çalışır, ancak ben herhangi bir programlama dilinde bunu yapmanın bir yolu varsa emin değilim. Onun sadece bir örneği, çünkü sınıfın kendisine atıfta bulunmak gibi bir şey isterdim, çünkü çocuk sınıfının class_attribute'una göre farklı davranmasını istiyorum. Böyle

Sonra sözde çıkış olmalıdır:

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

Aynı tekniği örnekleri üzerinden gerçekleştirmek olabilir biliyorum. Ancak, örnek oluşturmak istemiyorum, çünkü bazen __init__ yöntemindeki kod uzun ve zorlu olabilir ve eğer class_method'u sık sık aramak istersem, sadece bu tek yöntem çağrısı için kullanılan birçok örnek oluşturmam gerekirdi. Ve class_attribute ve class_method statik olduğundan ve örneklerle değiştirilmeyeceği için.

+0

Basitçe 'statik' işlevlerinden mi bahsediyorsunuz? – Tigran

cevap

9

sesler:

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 

Ya bgporter'ın işaret ettiği gibi, metotlara ihtiyaç duymadan, doğrudan niteliklerle yapabilirsiniz.

+0

evet, bu tam olarak istediğim şey, çok teşekkürler! – davekr

+0

ancak şu belgeleri dikkate alarak: "türetilmiş bir sınıf için bir sınıf yöntemi çağrılırsa, ** türetilmiş sınıf nesnesi **, ima edilen ilk argüman olarak iletilir", türetilmiş sınıf nesnesinin herhangi bir şekilde oluşturulacağı anlamına gelir mi? Çünkü OP, örnek yapılardan kaçınmak istiyor. – Tigran

+0

Yöntemi çağırmak istedim, çünkü yöntemdeki kod aslında daha karmaşık bir şey yapabilir ve sonra yalnızca yazdırma özelliklerini yazdırabilir. Ben daha kolay bir exmaple yapmak istediğimi daha kolay bir açıklama yapmak istiyorum ... böylece @classmethod bir çözümdür – davekr

3

Sadece veya oluştururken Örnekleri olmayan, Python çalışır: şaşırtıcı classmethod dekoratör ile yapılır değil classmethod, istedikleri gibi, Er

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