Tôi có một lớp học trong dự án chính mà tôi không muốn thay đổi.Làm thế nào để gọi phương thức gốc khi nó được vá khỉ?
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()
Tôi đang cố gắng xây dựng một mechansim plugin. Cho đến nay rất tốt, tôi có một điểm mở rộng như thế này:
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())
Một plugin có thể được viết như thế này:
class AExtended(A):
''' This is an extension I provide through a plugin mechanism
'''
def name(self):
return self.firstname + ' ' + self.lastname.upper()
này tất cả các hoạt động rất tốt. Bây giờ tôi nhận được "John DOE".
Vấn đề của tôi là phương thức gốc name()
có thể khá phức tạp. Nói cách khác, tôi không thể gọi số self.lastname.upper()
trong số AExtended
. Tôi muốn gọi phương thức "siêu", không tồn tại nữa, bởi vì nó đã bị ghi đè.
Làm thế nào tôi có thể thay đổi mã của tôi, để đạt được một cái gì đó như thế này:
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()
Nhờ sự giúp đỡ của bạn!
Chỉnh sửa: Một số giải thích về những gì tôi cố gắng làm.
- Tôi muốn plugin cập nhật hành vi của
A
. Tôi không thể đủ khả năng để thay đổi tiêu dùng hiện có của A - Có rất nhiều lớp học như
A
mà có thể được thay đổi, tôi muốn bổ sung để có thể kiểm soát đầy đủ và trách nhiệm - Đúng
AExtended
không nhất thiết phải kế thừa từA
, nhưng đó là cách dễ dàng để truy cậpself.firstname
. Tôi không gặp vấn đề gì sau một mẫu thiết kế khác nếu nó có thể giúp.
Tôi có một cách giải quyết, nhưng nó không phải là rất tao nhã và khó có thể khái quát
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
Vâng, tôi đọc cách [gọi phương thức lớp cha] (http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from- child-class-in-python) nhưng trong 'AExtended.name',' self' là 'A' vì ghi đè – rds
Tôi có thể có nhiều lcuky hơn với [ghi đè một phương thức riêng] (http://stackoverflow.com/ câu hỏi/2484215/how-do-i-ghi đè-một-cha-class-chức năng-in-python) nhưng tôi không thể thay đổi tên phương thức A. – rds
Với sự giải thích của bạn, tôi sẽ đề nghị bạn thay đổi tiêu đề câu hỏi. Một tiêu đề chính xác hơn có thể là "Cách gọi phương thức ban đầu khi nó được vá khỉ?" – Weeble