Değiştirmek istemediğim ana projede bir dersim var.Maymun eklendiğinde orijinal yöntem nasıl aranır?
class A():
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def name(self):
# this method could be much more complex
return self.lastname.upper()
Bir eklenti mechansim oluşturmaya çalışıyorum.
if __name__ == '__main__':
''' The main project has an extension point that allows me to do'''
# for each class extension such as AExtended:
A.name = AExtended.name
''' After the extensions are loaded, some behaviours may be changed'''
a = A("John", "Doe")
print(a.name())
bir eklenti böyle yazılabilir::
class AExtended(A):
''' This is an extension I provide through a plugin mechanism
'''
def name(self):
return self.firstname + ' ' + self.lastname.upper()
Bunların hepsi çok iyi çalışıyor Şimdiye kadar iyi, böyle bir uzatma noktası vardır. Şimdi "John DOE" aldım.
Sorunum, özgün name()
yönteminin oldukça karmaşık olabileceğidir. Başka bir deyişle, AExtended
numaralı telefondan self.lastname.upper()
numaralı telefonu arayacağım paranız yok. Artık mevcut olmayan "süper" yöntemini çağırmak istiyorum, çünkü üzerine yazılmıştır. Yardımlarınız için
class AExtended(A):
def name(self):
# I'm looking for a way to call the base implementation that was in A.name()
return self.firstname + ' ' + parent.name()
Teşekkür: Böyle bir şey elde etmek için, benim kodunu değiştirmek nasıl
!
Düzenleme: Yapmaya çalıştığımın bazı açıklamaları.
- Eklentinin
A
davranışını yamasını istiyorum. Ben mevcut tüketicileri değiştirmeye bütçesi yetmeyen - değiştirilebilir
A
gibi birçok sınıflar ben tam kontrol ve sorumluluğu - olması eklentileri istiyorum vardır O
AExtended
A
devralmak zorunda değildir doğru, ancakself.firstname
'a erişmenin kolay bir yoluydu. Yardımcı olabiliyorsa farklı bir tasarım deseninin ardından problemim yok.
ben bir çözüm var, ama her zaman this non-standard package den @override
dekoratör kullanmaktır Python gibi bir dilde en iyi olmayabilir
class AExtended(A):
def name(self):
# I'm looking for a way to call the base implementation that was in A.name()
return self.firstname + ' ' + self.parentname()
#in main
A.parentname = A.name
A.name = AExtended.name
Evet, ([üst sınıf yöntemini çağırmak] nasıl okumak http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from- çocuk class-in-python) ama 'AExtended.name' içinde,' self' bir 'A' – rds
geçersiz kıldığından dolayı [özel bir yöntemi geçersiz kılarak] daha lcuky olabilir (http://stackoverflow.com/ soruları/2484215/nasıl yapılır-psthon-a-ebeveyn sınıfları-işlevleri-python) ama A yöntem adını değiştiremiyorum. – rds
Açıklamalarınız ışığında, soru başlığını değiştirmenizi öneririm. Daha doğru bir başlık, "Maymun yamalandığında orijinal yöntem nasıl aranır?" – Weeble