我需要按名称在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
答案 0 :(得分:2)
您正在寻找的是getattr()
。这有效:
>>> getattr(o, "p")
<bound method A.p of <__main__.AB object at 0x0000000000AA8160>>
直接使用__getattribute__()
,您将失去对该对象的包裹super()
。您应始终使用getattr()
来获取方法或其他属性。通常,如果有其他选项,则不建议直接使用__dunder__
方法。