如何调用右侧定义的方法 class。 Python继承。多重继承。钻石场景python继承
How to call methods which are present in right side defined class. Python inheritance. multiple inheritance. Dimond scenario python inheritance
我有一个 class 是从另外两个 class 继承的。当我从 child class 调用方法时,它总是调用在 class 定义中提到左侧的方法。
我知道这种方式 Python 有效。它首先检查左侧 class 的方法,然后检查右侧 class 的方法。
但现在我无法更改我的 child class 定义。
请给我一些帮助,我如何调用 "Second" class.
中存在的相同方法
我对 Python 有点陌生。
使用 python 2.7
class First(object):
def get_details(self):
print "This method gets called every time"
print "I can't change my Child class structure"
class Second(object):
def get_details(self):
print "But I want to call the same method of this class.. "
print "Please let me know what can I do? How do I call method of second inherited class"
class Child(First, Second):
pass
child_obj = Child()
child_obj.get_details()
您始终可以直接调用方法,方法是在 class 上调用它们,您要使用的方法定义如下:
Second.get_details(child_obj)
对于更一般的情况,您可能不知道父 classes 但想篡改 class 的 method resolution order, you can inspect said order using the mro
方法:
Child.mro()
# [<class 'Child'>,
# <class 'First'>,
# <class 'Second'>,
# <class 'object'>]
你可以故意跳过父 classes:
Child.mro()[2].get_details(child_obj)
或倒序:
for klass in reversed(Child.mro()):
if hasattr(klass, 'get_details'):
klass.get_details(child_obj)
break
您可以直接调用它:
Second.get_details(child_obj)
或使用.mro()
获取方法解析顺序并选择第二个父类:
Child.mro()[2].get_details(child_obj)
方法解析顺序显示 类 Python 用于查找方法的搜索顺序:
>>> Child.mro()
[__main__.Child, __main__.First, __main__.Second, object]
一旦在此列表中找到 get_details()
,它就会停止并使用它。
我建议将此逻辑隐藏在 Child
:
的方法中
class Child(First, Second):
def get_details_second_1(self):
"""Option 1"""
return Second.get_details(self)
def get_details_second_2(self):
"""Option 2"""
return Child.mro()[2].get_details(self)
child_obj = Child()
child_obj.get_details_second_1()
child_obj.get_details_second_2()
我有一个 class 是从另外两个 class 继承的。当我从 child class 调用方法时,它总是调用在 class 定义中提到左侧的方法。
我知道这种方式 Python 有效。它首先检查左侧 class 的方法,然后检查右侧 class 的方法。
但现在我无法更改我的 child class 定义。 请给我一些帮助,我如何调用 "Second" class.
中存在的相同方法我对 Python 有点陌生。 使用 python 2.7
class First(object):
def get_details(self):
print "This method gets called every time"
print "I can't change my Child class structure"
class Second(object):
def get_details(self):
print "But I want to call the same method of this class.. "
print "Please let me know what can I do? How do I call method of second inherited class"
class Child(First, Second):
pass
child_obj = Child()
child_obj.get_details()
您始终可以直接调用方法,方法是在 class 上调用它们,您要使用的方法定义如下:
Second.get_details(child_obj)
对于更一般的情况,您可能不知道父 classes 但想篡改 class 的 method resolution order, you can inspect said order using the mro
方法:
Child.mro()
# [<class 'Child'>,
# <class 'First'>,
# <class 'Second'>,
# <class 'object'>]
你可以故意跳过父 classes:
Child.mro()[2].get_details(child_obj)
或倒序:
for klass in reversed(Child.mro()):
if hasattr(klass, 'get_details'):
klass.get_details(child_obj)
break
您可以直接调用它:
Second.get_details(child_obj)
或使用.mro()
获取方法解析顺序并选择第二个父类:
Child.mro()[2].get_details(child_obj)
方法解析顺序显示 类 Python 用于查找方法的搜索顺序:
>>> Child.mro()
[__main__.Child, __main__.First, __main__.Second, object]
一旦在此列表中找到 get_details()
,它就会停止并使用它。
我建议将此逻辑隐藏在 Child
:
class Child(First, Second):
def get_details_second_1(self):
"""Option 1"""
return Second.get_details(self)
def get_details_second_2(self):
"""Option 2"""
return Child.mro()[2].get_details(self)
child_obj = Child()
child_obj.get_details_second_1()
child_obj.get_details_second_2()