【问题标题】:Is there a way to gain access to the class of a method when all you have is a callable当你只有一个可调用的时候,有没有办法访问方法的类
【发布时间】:2015-11-18 14:19:58
【问题描述】:

我有这样的代码:

class Foo:
    def foo(self):
        pass


class Bar:
    def foo(self):
        pass

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

如何从 f 访问 BarFoo

f.__dict__ 几乎没有帮助,但正如repr(f)<bound method Bar.foo of <__main__.Bar object at 0x10c6eec18>>' 一样,它一定是可能的,但是如何?

【问题讨论】:

    标签: python methods metaprogramming


    【解决方案1】:

    每个绑定方法都有__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

    【讨论】:

    • Nitpick:实例的类型不一定是定义函数的类;仅仅因为该方法绑定到 X 实例并不意味着该函数不能在类 Y 中定义。但话虽如此,这段代码肯定会在 99.99% 的实际场景中产生正确的输出。无论如何,尚不清楚在这种 0.01% 的情况下 OP 的预期输出是多少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2010-11-05
    相关资源
    最近更新 更多