是否有可能在Python中检测冲突的方法名称?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了是否有可能在Python中检测冲突的方法名称?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2389字,纯文字阅读大概需要4分钟。
内容图文
![是否有可能在Python中检测冲突的方法名称?](/upload/InfoBanner/zyjiaocheng/785/3ba8eeb0fe02437fa7614ff365d5e7a5.jpg)
我创建了一个名为Liger的Python类,它扩展了一个名为Lion的类和一个名为Tiger的类. Liger类继承了Lion和Tiger的方法speak(),但语法仍然有效 – 没有打印错误信息,相反,Tiger的speak()方法的实现是由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的下一个类中调用相同的方法.通常你需要从一个公共基类继承来使它工作(否则最后一次调用super将得到对象,它不会定义方法):
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实例的说话方法将打印Roar然后Rawr,这是有道理的,因为它既是狮子又是老虎.但是要注意这种编码风格,因为让协作正常工作可能很棘手.例如,您无法更改方法签名并期望它在协作多继承情况下正常工作(除非您仅使用关键字参数,并传递** kwargs中任何未识别的方法).
第二个解决方案是给Liger它自己的发言实现明确选择做什么(可能是调用它的一个基类).这在某些其他语言中是必需的,例如C.如果你请求的继承没有做你想要的,那么它可能是解决它的最直接的方法:
class Liger(Lion, Tiger):
def speak(self):
Tiger.speak(self)
内容总结
以上是互联网集市为您收集整理的是否有可能在Python中检测冲突的方法名称?全部内容,希望文章能够帮你解决是否有可能在Python中检测冲突的方法名称?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。