Sp phương pháp sinh thái được nhìn lên trên loại (ví dụ: lớp học) của đối tượng đang được vận hành, chứ không phải trên trường hợp cụ thể. Hãy suy nghĩ về nó: nếu không, nếu một lớp định nghĩa __call__
ví dụ, khi lớp học được gọi là __call__
nên được gọi là ... một thảm họa! Nhưng may mắn thay, phương pháp đặc biệt thay vào đó là nhìn lên loại của lớp học, siêu thi AKA, và tất cả đều tốt ("các lớp kế thừa" có hành vi rất bất thường trong điều này, đó là lý do tại sao chúng ta tốt hơn với những kiểu mới - đó là những cái duy nhất còn lại trong Python 3).
Vì vậy, nếu bạn cần "ghi đè mỗi thể hiện" các phương pháp đặc biệt, bạn phải đảm bảo cá thể có lớp duy nhất của riêng nó. Điều đó rất dễ dàng:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
và bạn đang ở đó. Tất nhiên điều đó sẽ là ngớ ngẩn trong trường hợp này, vì mỗi trường hợp kết thúc với cùng một "cái gọi là một ví dụ" (!) __call__
, nhưng nó sẽ hữu ích nếu bạn thực sự cần ghi đè trên cơ sở từng cá thể .
Nguồn
2009-11-10 06:15:20
Tôi đang cố gắng để làm cho một số đường syntatic. Bạn có thể tưởng tượng tạo ra một bộ tạo hàm động như thế này. lớp A: b = create_custom_function ("AA") c = create_custom_function ("BB") – kjshim