Tôi cần viết một lớp cho phép một lớp con thiết lập một thuộc tính với tên của một hàm. Hàm đó sau đó phải được gọi từ các thể hiện của lớp.Viết một lớp chấp nhận gọi lại bằng Python?
Ví dụ, tôi nói rằng tôi cần phải viết một lớp trái cây, nơi phân lớp có thể vượt qua trong một thông điệp chào mừng. Lớp Fruit phải trưng ra một thuộc tính print_callback có thể được thiết lập.
class Fruit(object):
print_callback = None
def __init__(self, *args, **kwargs):
super(Fruit, self).__init__(*args, **kwargs)
self.print_callback("Message from Fruit: ")
tôi cần để lộ một API được có thể được tiêu thụ bởi mã này (phải rõ ràng, mã này không thể thay đổi, nói rằng nó là mã bên thứ 3):
def apple_print(f):
print "%sI am an Apple!" % f
class Apple(Fruit):
print_callback = apple_print
Nếu tôi chạy:
mac = Apple()
tôi muốn nhận được:
Message from Fruit: I am an Apple!
Thay vào đó tôi nhận được:
TypeError: apple_print() takes exactly 1 argument (2 given)
Tôi nghĩ rằng điều này là do tự được chuyển vào làm đối số đầu tiên.
Vậy làm cách nào để viết lớp Fruit? Cảm ơn!
Tôi đánh giá cao những vấn đề bạn đã có với cách tiếp cận này và những giải pháp tuyệt vời dưới đây. Tuy nhiên điều này trông giống như bạn nên định nghĩa 'print_callback' như một phương thức (có thể chỉ được gọi là' print_me', và nhận các lớp con để ghi đè lên nó.Điều đó sẽ đơn giản và nhiệt tình. Đối với mọi loại phương thức 'print_me' khác nhau, hãy tạo một lớp con khác. –
Động lực của tôi cho việc đặt ra câu hỏi là tôi muốn phân lớp google.appengine.ext.db.djangoforms của Google App Engine (ví dụ như DF2) để cho phép ghi đè thuộc tính formfield_callback theo cách tương tự như ModelForm của Django (django.forms.ModelForm). Ý tưởng là 'lớp f (DF2)' sau đó có thể được sử dụng bởi Django tiêu chuẩn đơn giản bằng cách thay đổi lớp cha thành django.forms.ModelForm. Tôi không biết tại sao các tác giả Django định nghĩa formfield_callback là một thuộc tính. –