super()对象的动态方法解析

时间:2016-04-02 08:36:35

标签: python python-2.7

我需要按名称在super()对象上找到一个方法。这适用于使用"点运算符"符号:super(self.__class__,self).p。但是,我需要动态地执行此操作,例如super(self.__class__,self)["p"],这不起作用。

我尝试使用__getattr__,但超级对象没有该方法。并super(self.__class__,self).__getattribute__("p")返回self.p而不是super().p

如何正确优雅地做到这一点?

例如:

class A(object):
    def p (self):
        skip

class B(object):
    def p (self):
        skip

class AB (A,B):
    def p (self):
        skip

ab = AB()
o = super(ab.__class__, ab)

print dir(o)
print o.__getattribute__("p").__code__
print o.p.__code__

此代码输出:

['__class__', '__delattr__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__
', '__self__', '__self_class__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__thisclass__']
<code object p at 000000000205f2b0, file "b.py", line 10>  # AB.p
<code object p at 0000000000361cb0, file "b.py", line 2>   # A.p

1 个答案:

答案 0 :(得分:2)

您正在寻找的是getattr()。这有效:

>>> getattr(o, "p")
<bound method A.p of <__main__.AB object at 0x0000000000AA8160>>

直接使用__getattribute__(),您将失去对该对象的包裹super()。您应始终使用getattr()来获取方法或其他属性。通常,如果有其他选项,则不建议直接使用__dunder__方法。