gpt4 book ai didi

python - 是否可以在 Python 中检测冲突的方法名称?

转载 作者:太空狗 更新时间:2023-10-30 01:16:12 25 4
gpt4 key购买 nike

我创建了一个名为 Liger 的 Python 类,它扩展了一个名为 Lion 的类和一个名为 Tiger 的类。 Liger 类从 LionTiger 继承方法 speak(),但语法仍然有效 -没有错误消息被打印出来,而是 Tigerspeak() 方法的实现被 Liger 继承了。有没有可能在 Python 中像这样检测方法名冲突,以便在这种方法名冲突时打印错误消息?

'''
Conflicting method names in python
'''


class Tiger():
@staticmethod
def speak():
print "Rawr!";

class Lion():
@staticmethod
def speak():
print "Roar!";

class Liger(Tiger, Lion):
pass
'''both superclasses define a speak() method, and I need a way to detect this type of conflict.'''

Liger.speak(); ''' this prints "Rawr" instead of printing an error message. '''
'''Is there any way to detect method name collisions like this one?'''

代码可以在这里在线测试和调试:http://ideone.com/xXOoVq

最佳答案

我不确定继承是否是您用来解决问题的正确机制。人们常说继承定义了两个类之间的“IS-A”关系。也就是说,如果 A继承自 B , B 的每个实例是 A 的实例还有。

如果您使用多重继承,类最终会同时成为多种对象。在您的示例中,一个 Liger例如,两者都是 Tiger和一个 Lion同时。

您可能不想使用类继承来模拟物种继承。尽管名称不同,但它们的真正含义并不相同。例如,家猫可能是某种非常像老虎的动物的后代,但说家猫是老虎是不正确的。

您在类上使用静态方法这一事实让我认为您可能根本不想使用类,而是更通用的实例 Animal类:

class Animal(object):
def __init__(self, sound):
self.sound = sound

def speak(self):
print self.sound

lion = Animal("Roar!")

那里没有继承机制,但可以添加一种方法,以某种方式将一种 Animal 突变为另一种。

现在,如果您真的打算使用类和多重继承,有两种不错的方法(使用常规实例方法,而不是静态方法):

首先是进行“协同多重继承”,让你的每个方法在 MRO 中的下一个类上调用相同的方法。通常你需要从一个公共(public)基类继承才能使它工作(否则最后一次调用 super 将得到 object ,它不会定义方法):

class Animal(object):
def speak(self):
pass

class Lion(Animal):
def speak(self):
print("Roar!")
super(Lion, self).speak()

class Tiger(Animal):
def speak(self):
print("Rawr!")
super(Tiger, self).speak()

class Liger(Lion, Tiger):
pass

在这种情况下,Liger实例的 speak方法将同时打印 Roar然后Rawr ,这是有道理的,因为它既是狮子又是老虎。不过要小心这种编码风格,因为要使协作正常进行可能很棘手。例如,您不能更改方法签名并期望它在协作多重继承情况下正常工作(除非您仅使用关键字参数,并在 **kwargs 中传递任何无法识别的参数)。

第二种解决方案是给Liger它是自己的speak明确选择要做什么的实现(可能是调用其基类之一)。这在某些其他语言中是必需的,例如 C++。如果您请求的继承没有按照您的意愿进行,这可能是最直接的修复方法:

class Liger(Lion, Tiger):
def speak(self):
Tiger.speak(self)

关于python - 是否可以在 Python 中检测冲突的方法名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15328566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com