3 sınıf sınıf devralma düzeyine sahip bazı kodlarla çalışıyorum. En düşük seviyeli türetilmiş sınıftan, bir yöntemin (2) hiyerarşiyi (ör. Bir super.super çağrı? "Orta" sınıfı, aramam gereken yöntemi uygulamıyor.Süper yöntem nasıl aranır?
cevap
Eh, bunu yapmanın bir yolu şudur:
class Grandparent(object):
def my_method(self):
print "Grandparent"
class Parent(Grandparent):
def my_method(self):
print "Parent"
class Child(Parent):
def my_method(self):
print "Hello Grandparent"
Grandparent.my_method(self)
Belki istediğini değil ama yanılmıyorsam iyi piton vardır bu. İstediğin şey, anti-pythonic gibi sesler çıkarır ve niçin yaptığımıza dair bir şey yapmanın mutlu python yöntemini vermemiz gerektiğini açıklamak zorunda kalırsın.
başka örnek, belki (sizin yorumlardan) istediğini: Gördüğünüz gibi
class Grandparent(object):
def my_method(self):
print "Grandparent"
class Parent(Grandparent):
def some_other_method(self):
print "Parent"
class Child(Parent):
def my_method(self):
print "Hello Grandparent"
super(Child, self).my_method()
, Parent
my_method
ama Child
hala Parent
"gördüğü yönteme ulaşmak için süper kullanabilirsiniz uygulamıyor "Grandparent
" my_method
.
Zaten iç içe "süper" çağrıları yapabileceğinizi sanmıyorum çünkü tür "süper" olacaktır. –
Benim durumumda, Parent sınıfı my_method'u uygulamıyor ve bunu sadece çocuk aramasını işe almak için eklemek istemiyorum. – SeanLabs
Orta sınıfa ebeveyn sınıfından yöntemler devralmanıza gerek yok, bu yüzden "super(). Method()" ifadesi işe yarayacaktı. –
yukarı iki seviye istiyorsanız, neden sadece
class GrandParent(object):
def act(self):
print 'grandpa act'
class Parent(GrandParent):
def act(self):
print 'parent act'
class Child(Parent):
def act(self):
super(Child.__bases__[0], self).act()
print 'child act'
instance = Child()
instance.act()
# Prints out
# >>> grandpa act
# >>> child act
Sen __bases__
boşsa kontrol veya orta sınıflar çoklu kalıtım varsa üzerinde döngü gibi bir şey savunmacı ekleyebilirsiniz yapamaz. Yuvalama süper çalışmıyor çünkü süper tipi üst tip değil.
Asla, * hiç *, EVER, 'super()' içinde 'self .__ class__' kullanın. Üslere bile ulaşma. 'self .__ class__' **, her zaman yöntemi tanımladığınız sınıf değil **, bir alt sınıf olabilir. Başka iki miras kalıntısı eklerseniz, artık sonsuz bir döngüye sahipsiniz. –
Sizin durumunuzda sınıfının işlevinin my_method
işlevini çağırması.
Bunu iki yolla statik ve dinamik olarak yapabilirsiniz. Ben 0 endeksini aldı neden
Dinamik İşte
class C(object):
def my_method(self):
print "in function c"
class B(C):
def my_method(self):
print "in function b"
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# This is how you can call my_method from C here ?
super((self.__class__.__bases__)[0], self).my_method()
obj_a = A()
obj_a.my_method()
(self.__class__.__bases__
) tuple tipi thats A
taban sınıfları dönecektir. Böylece B
sınıfını B
sınıfında süper argüman olarak sınıfının B
sınıfının temel sınıfına döndürecektir.
Statik
class C(object):
def my_method(self):
print "in function c"
class B(C):
def my_method(self):
print "in function b"
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# This is how you can call my_method from C here ?
obj_a = A()
super(A, obj_a).my_method() # calls function of class B
super(B, obj_a).my_method() # calls function of class C
Asla, * hiç *, EVER, 'super()' içinde 'self .__ class__' kullanın. Üslere bile ulaşma. 'self .__ class__' **, her zaman yöntemi tanımladığınız sınıf değil **, bir alt sınıf olabilir. Başka iki miras kalıntısı eklerseniz, artık sonsuz bir döngüye sahipsiniz. –
biraz melodramatik mi? – dopatraman
Bu benim için çalışıyor:
class Grandparent(object):
def my_method(self):
print "Grandparent"
class Parent(Grandparent):
def my_method(self):
print "Parent"
class Child(Parent):
def my_method(self):
print "Hello Grandparent"
super(Parent, self).my_method()
Bu, muhtemelen doğru cevap olarak işaretlenmesi gereken cevaptır. – nesdis
- 1. Belirsiz yöntem nasıl aranır?
- 2. Maymun eklendiğinde orijinal yöntem nasıl aranır?
- 3. Terminal ile jar dosyasında yöntem nasıl aranır?
- 4. ruby'de süper sınıfta başka bir yöntem çağırma
- 5. Derleyici içinde türü ve adı verilen bir yöntem nasıl aranır?
- 6. Recycler.Adapter'da getFragmentManager nasıl aranır?
- 7. xib'den performSegueWithIdentifier nasıl aranır?
- 8. MSBuild'den Path.Combine nasıl aranır?
- 9. iPhone: UISearchBar "" String nasıl aranır?
- 10. Sayısal dizide öğe nasıl aranır?
- 11. Windows çekirdeğindeki usermode nasıl aranır?
- 12. Google'da javascript dosyası nasıl aranır?
- 13. heightForRowAtIndexPath varsayılan uygulaması nasıl aranır?
- 14. Sınıf içinde kurucu nasıl aranır?
- 15. Vim'de yüzde sembolü (%) nasıl aranır?
- 16. Sunucuda javascript çerezi nasıl aranır?
- 17. UITapGestureRecognizer ile didSelectRowAtIndexPath yöntemi nasıl aranır?
- 18. Python 3, süper .__ del __()
- 19. Süper aktivite
- 20. java Generics - Çocuk sınıfı tipini ve süper sınıfı tanıyan çocuk aşırı yüklenmiş yöntem nasıl çağırılır
- 21. çağrılması coffeescript süper yöntemler
- 22. Bir "süper" aramanın Scala
- 23. Çağrı Süper Oluşturucu
- 24. Kendo şablon bağlamadan ebeveyn yöntemi nasıl aranır?
- 25. Krom tarayıcıda ana pencere işlevi nasıl aranır?
- 26. Bir nesnenin dizini pürüzlü dizide nasıl aranır?
- 27. Linux'ta python'dan Wine dll nasıl aranır?
- 28. SQLite'de bir alt dizgi nasıl aranır?
- 29. C# ile CORBA arabirimi nasıl aranır?
- 30. FitNesse'den bir WCF servisi nasıl aranır?
Neden böyle ihtiyacım var? Orta sınıftaki yöntemin üzerine yazmış olmadıkça, tek bir süper() çağrı yeterli olmalıdır, bu durumda orta sınıf, super() yöntemini doğru çağırmaya dikkat etmelidir. –
Eğer orta sınıf bu yöntemi uygulamıyorsa, sadece 'super()' ı çağırın.() 'Çalışmalıdır, çünkü miras yoluyla orta sınıfınız süper sınıf –
yöntemlerini miras alır? MRO'da * bir uygulama atlamak mı istiyorsunuz? – jonrsharpe