【发布时间】:2012-08-13 12:22:22
【问题描述】:
我的问题有点类似于this one;它涉及对象方法而不是模块内容。我想知道我是否可以使用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>)]
用户不需要知道或关心fs 的存在,因为她只会对gs 感兴趣。 (当然,这个输出在绝大多数情况下都是有意义的,因为所有这些方法都将在实例化时绑定到对象。)对于长继承树,返回的列表可能会变得很长并且充满了'与用户无关。
我怎样才能让它从这个列表中删除f1 和f2?类中定义的方法是否有与__module__ 属性等效的属性?更好的是,是否可以用 instance 方法做同样的事情?
【问题讨论】:
-
在绑定方法(
Bar的实例)上请求im_class不起作用。它也不适用于未绑定的方法。 -
object.hasOwnPro…等一下,这是不对的。 (抱歉,我简直不敢相信 JavaScript 比 Python 更容易做的事情。)
标签: python methods introspection inspect