Tôi tự hỏi liệu có thể tạo ra một phương thức hoạt động khác khi được gọi là phương thức lớp hay không khi được gọi là phương thức thể hiện.Phương thức lớp hoạt động khác khi được gọi là phương thức thể hiện?
Ví dụ, như một dự án cải thiện kỹ năng, tôi đang viết một lớp Matrix
(vâng, tôi biết có các lớp ma trận hoàn toàn tốt đã có sẵn). Tôi đã tạo một phương thức lớp cho nó được gọi là identity
trả về ma trận nhận dạng của một kích thước được chỉ định.
Bây giờ, khi được gọi trên một ví dụ của Matrix
, có vẻ hợp lý rằng kích thước không cần phải được chỉ định; nó sẽ trả về ma trận nhận dạng có cùng kích thước với tên gọi là Matrix
.
Nói cách khác, tôi muốn xác định một phương pháp có thể xác định xem nó có được gọi thông qua một cá thể không và nếu có, hãy truy cập các thuộc tính của cá thể đó. Thật không may, ngay cả sau khi đào bới thông qua tài liệu và một vài tìm kiếm của Google, tôi đã không tìm thấy bất cứ điều gì cho thấy điều này là có thể. Có ai biết khác nhau không?
Edit:
Wow! Rõ ràng, tôi vẫn chưa quen với các chức năng hạng nhất. Đây là những gì tôi đã kết thúc với - nhờ không biết để cung cấp chìa khóa!
class Foo(object):
def __init__(self, bar):
self.baz = bar
self.bar = MethodType(lambda self: self.__class__.bar(self.baz), self, self.__class__)
@classmethod
def bar(cls, baz):
return 5 * baz
Foo.bar(3) # returns 15
foo = Foo(7)
foo.bar() # returns 35
Chỉnh sửa 2:
Chỉ cần một cách nhanh chóng lưu ý - kỹ thuật này (và hầu hết những trình bày dưới đây) sẽ không hoạt động trên lớp học mà xác định __slots__
, như bạn không thể gán phương pháp.
Câu hỏi được yêu cầu cho một đối tượng có thể gọi duy nhất có thể phát hiện nó được gọi như thế nào. (Điều này có thể thực hiện bằng cách sử dụng mô-đun kiểm tra để có được khung gọi.) 'Giải pháp' được trình bày là tạo một phương thức có thể gọi thứ hai, một phương thức ràng buộc, được ràng buộc với mỗi cá thể có cùng tên với tên gọi đầu tiên. Điều này có thể giải quyết vấn đề làm thế nào để có class và 'instance methods' có cùng tên. Nhưng nó không giống như có một cuộc gọi duy nhất có thể hành động như một trong hai. –
@TerryJanReedy có thể kiểm tra khung gọi trong thời gian chạy không? – aayush
Vâng, đây là những gì tôi có nghĩa là "sử dụng mô-đun kiểm tra để có được khung gọi". Có một hoặc nhiều chức năng cho việc này. –