2015-11-18 2 views
10

У меня есть код, как:Есть ли способ, чтобы получить доступ к классу методы, когда все у вас есть вызываемая

class Foo: 
    def foo(self): 
     pass 


class Bar: 
    def foo(self): 
     pass 

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

Как получить доступ к Bar или Foo от F?

f.__dict__ не имеет какой-либо помощи, но поскольку repr(f) дает <bound method Bar.foo of <__main__.Bar object at 0x10c6eec18>>', это должно быть возможно, но как?

ответ

16

Каждый связанный метод имеет атрибут __self__, который является экземпляром

, с которой связан этот метод, или None

(скопированный с here)

Подробнее о связанных методов (от Data Model):

Если вы получаете доступ к методу (функции, заданной в пространстве имен классов) через экземпляр, вы получаете специальный объект: связанный метод (также метод , называемый методом экземпляра). ... Связанные методы имеют два специальных только для чтения атрибутов: m.__self__ является объектом, на котором метод работает ...

Так f.__self__ поможет вам экземпляр класса:

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

И type(f.__self__) или f.__self__.__class__ получит вас тип объекта:

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

Вы бы использовать только __class__ для old-style classes.

+0

Nitpick: тип экземпляра не обязательно является классом, в котором определена функция; просто потому, что метод связан с экземпляром X, не означает, что функция не может быть определена в классе Y. Но при этом этот код, безусловно, даст правильный результат в 99,99% реальных сценариев. И в любом случае неясно, какой ожидаемый результат OP будет в таком случае 0,01%. –