hãy nhìn vào ví dụ đơn giản:Python phân biệt hàm gọi lại là thành viên của một lớp như thế nào?
class A:
def __init__(self, flag):
self.flag = flag
def func(self):
print self.flag
a = A(1)
b = A(2)
callback_a = a.func
callback_b = b.func
callback_a()
callback_b()
Kết quả là:
1
2
Nó chạy như mong đợi. Nhưng tôi có một câu hỏi. Trong C, hàm gọi lại được chuyển thành một con trỏ. Trong Python, cần có cách tương tự để thực hiện việc này, vì vậy người gọi biết địa chỉ của hàm. Nhưng trong ví dụ của tôi, không chỉ con trỏ hàm được truyền, mà còn tham số (self) được truyền, bởi vì cùng một phương thức của cùng một lớp in ra các kết quả khác nhau. Vì vậy, câu hỏi của tôi là:
Phương thức như vậy trong Python chỉ có một bản sao trong bộ nhớ? Ý nghĩa của tôi là mã của bất kỳ phương thức nào chỉ có một bản sao, và trong ví dụ của tôi, phương thức này sẽ không được nhân bản. Tôi nghĩ rằng nó chỉ nên có một bản sao, nhưng ở đây tôi vẫn thực hiện câu hỏi này để có được nhiều đầu vào hơn.
Tôi nhớ mọi thứ trong Python là một đối tượng. Vì vậy, trong ví dụ của tôi, có hai trường hợp chức năng với các thông số khác nhau nhưng chỉ có một bản sao của mã?
Tôi nghĩ nó sẽ tạo ra sự đóng cửa? –
Bạn nên sử dụng các lớp kiểu mới. Phân lớp mọi thứ từ 'đối tượng' hoặc thứ gì đó phân lớp nó. – aaronasterling
@aaronasterling: Mặc dù tôi không chắc nó có quá nhiều tác động đối với câu hỏi trong tầm tay? – jdi