我的问题有些类似于 这个问题,但是与模块内容不同,它涉及对象方法。我想知道是否可以使用
我需要这个功能,因为我的子类定义了“宏”方法,该方法在更高层次上访问父类的方法,我不希望用户担心从继承树向上定义的所有低级别方法。
下面是一个简化的示例:
用户无需知道或关心 f 的存在,因为她只对 g 感兴趣。 (当然,在实例化对象时,所有这些方法都将绑定到对象,因此在绝大多数情况下,这个输出是有意义的。)对于长的继承树,返回的列表可能会变得非常长,并且充满了用户不关心的内容。
如何让列表中去掉 f1 和 f2?是否有类似于 __module__ 属性的东西适用于类中定义的方法?更好的方法是能否对实例方法执行相同的操作?
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 的存在,因为她只对 g 感兴趣。 (当然,在实例化对象时,所有这些方法都将绑定到对象,因此在绝大多数情况下,这个输出是有意义的。)对于长的继承树,返回的列表可能会变得非常长,并且充满了用户不关心的内容。
如何让列表中去掉 f1 和 f2?是否有类似于 __module__ 属性的东西适用于类中定义的方法?更好的方法是能否对实例方法执行相同的操作?
Bar
上绑定的方法中询问im_class
是不起作用的,未绑定的方法也是如此。 - Benjamin Hodgsonobject.hasOwnPro…
等等,这不对。 (抱歉,我只是无法相信 JavaScript 比 Python 更容易做某些事情。) - kojiro