繁体   English   中英

Python-如何查询定义方法的类?

[英]Python - How can I query the class in which a method is defined?

我的问题与相似。 它涉及对象方法而不是模块内容。 我想知道是否可以使用inspect模块获取仅在我要询问的类中定义的方法,而不是其父类中定义的方法。

我之所以需要这样做,是因为我的子类定义了“宏”方法,该方法在更高的抽象级别访问父方法,并且我不希望用户担心在继承过程中一直定义的低级方法。树。

这是一个简化的例子:

class Foo(object):
    def __init__(self): pass
    def f1(self): return 3
    def f2(self): return 1

class Bar(Foo):
    def __init__(self): Foo.__init__(self)
    def g1(self): return self.f1() + self.f2()
    def g2(self): return self.f1() - self.f2()

import inspect
inspect.getmembers(Bar, inspect.ismethod)

输出:

[('__init__', <unbound method Bar.__init__>),
 ('f1', <unbound method Bar.f1>),
 ('f2', <unbound method Bar.f2>),
 ('g1', <unbound method Bar.g1>),
 ('g2', <unbound method Bar.g2>)]

用户不必知道或关心f s的存在,因为她只会对g s感兴趣。 (当然,此输出在绝大多数情况下都是有意义的,因为所有这些方法都将在实例化时绑定到该对象。)对于长继承树,返回的列表可能会很长,并且充满了与用户无关。

我如何才能将f1f2排除在此列表之外? 类中定义的方法的__module__属性是否等效? 更好的是,是否可以对实例方法执行相同的操作?

方法具有im_class属性,该属性指向相关的类。 您可以在属于该类成员的函数上使用该过滤器:

inspect.getmembers(Bar,
    lambda m: inspect.ismethod(m) and m.__func__ in m.im_class.__dict__.values())

这给你:

[
    ('__init__', <unbound method Bar.__init__>),
    ('f1', <unbound method Bar.f1>), 
    ('f2', <unbound method Bar.f2>)
]

当然,您可以完全绕开getmembers然后:

[m for m in Bar.__dict__.values() if inspect.isfunction(m)]

得到:

[<function __init__ at 0x100a28de8>, <function g1 at 0x100a28e60>, <function g2 at 0x100a28ed8>]

这适用于绑定或未绑定的方法,它们具有相同的.__func__ (或im_func ,旧名称)属性。 绑定和未绑定之间的区别是.__self__属性的值(未绑定时为无)。

这些“秘密”属性都记录在Python数据模型中

希望有人会提供更好的解决方案,但是呢:

foo_members = inspect.getmembers(Foo,inspect.ismethod)
bar_members = inspect.getmembers(Bar,inspect.ismethod)

set(bar_members) - set(foo_members)

当然,在实际情况下,您可能需要遍历Bar.__bases__才能真正摆脱不想要的一切。

例如:

set(bar_members) - set(sum([inspect.getmembers(base,inspect.ismethod) for base in Bar.__bases__],[]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM