2015-11-18 11 views
10

Tôi có mã số đó là như:Có cách nào để đạt được quyền truy cập vào các lớp của một phương pháp khi tất cả các bạn có là một callable

class Foo: 
    def foo(self): 
     pass 


class Bar: 
    def foo(self): 
     pass 

f = random.choice((Foo().foo, Bar().foo)) 

Làm thế nào để truy cập Bar hoặc Foo từ f?

f.__dict__ không có ích gì, nhưng như repr(f) cung cấp cho <bound method Bar.foo of <__main__.Bar object at 0x10c6eec18>>' điều đó phải có thể, nhưng làm cách nào?

Trả lời

16

Mỗi phương pháp ràng buộc có thuộc tính __self__ đó là dụ

mà phương pháp này là ràng buộc, hoặc None

(sao chép từ here)

Thông tin thêm về các phương pháp ràng buộc (từ Data Model):

Nếu bạn truy cập một phương thức (một hàm được định nghĩa trong một không gian tên lớp) thông qua một cá thể, bạn sẽ nhận được một đối tượng đặc biệt: một phương thức ràng buộc (cũng là đối tượng gọi là thể hiện). ... phương pháp ràng buộc có hai đặc biệt chỉ đọc thuộc tính: m.__self__ là đối tượng mà trên đó các phương pháp hoạt động ...

Vì vậy f.__self__ sẽ giúp bạn có được dụ lớp:

print(f.__self__) # <__main__.Foo object at 0x7f766efeee48> 

type(f.__self__) hoặc f.__self__.__class__ sẽ giúp bạn có được đối tượng loại:

print(type(f.__self__)) # <class '__main__.Foo'> 

bạn chỉ muốn sử dụng __class__ cho old-style classes.

+0

Nitpick: Loại cá thể không nhất thiết phải là lớp nơi hàm được xác định; chỉ vì phương thức được ràng buộc với một cá thể X không có nghĩa là hàm không thể được định nghĩa trong lớp Y. Nhưng điều đó nói rằng, mã này chắc chắn sẽ tạo ra kết quả chính xác trong 99,99% các tình huống thực tế. Và dù sao thì không rõ đầu ra dự kiến ​​của OP sẽ ở mức 0,01% như thế nào. –

Các vấn đề liên quan