【问题标题】:Python Polymorphism through inheritance and interface通过继承和接口实现 Python 多态性
【发布时间】:2012-11-12 17:09:24
【问题描述】:

我正在使用 Python 2.7(谷歌应用引擎)

学习Python,弄明白了语言是如何利用继承实现多态的。

INHERITANCE-基于PYTHON中的多态性:

class pet:
  number_of_legs = None
  age = None

  def sleep(self):
    print "zzz"

  def count_legs(self):
    print "I have %s legs." % self.number_of_legs
    return self.number_of_legs


class dog(pet):
  def bark(self):
    print "woof"

doug = dog()

doug.number_of_legs = 5;

print "Doug has %s legs." % doug.count_legs()
doug.bark()

我的问题是:Python 是否具有松散耦合的多态性,即使用interface 而不是inheritance。例如,在 Java 中,没有祖先关系的类可以实现相同的接口。请参阅以下示例中的HouseDogPetRock

INTERFACE-基于JAVA中的多态性:

class Animal{
   int legs;
   double weight;

   public int getLegs(){return this.legs;}
   public double getWeight(){return this.weight}
}

interface Pet{
    public int getNumberOfDresses();
    public int getNumberOfToys();
}

class HouseDog extends Animal implements Pet{
   //... implementation here
}

class PetRock implements Pet{
   //a rock and a dog don't really have much in common.
   //But both can be treated as pets
}

问题:

再次:python是否有面向对象的方式来实现多态而不使用继承?

【问题讨论】:

  • Python 从不通过继承实现多态性。继承是一种重用代码的方法,其定义使得结果与多态性很好。
  • 我想这在技术上是正确的。谢谢。
  • @kasavbere:delnan 所说的不仅在技术上是正确的。其实是真的。
  • 可能还需要指出,Java 有interface 概念的唯一原因是避免在多重继承系统中调用复杂的语义方法。从类型的角度来看,Java 中的接口do 定义了祖先关系,就像类一样。只是他们无法提供与之相匹配的方法继承。

标签: java python interface polymorphism


【解决方案1】:

是的,他们称之为Duck Typing。无需正式实现接口。 Java 风格的接口不存在,因为 Python 具有多重继承,所以如果要定义接口,只需使用常规类作为超类型。但是,一般来说,人们避免创建完全抽象的基类,而是利用鸭子类型。

对于您的示例,可以省略Pet 接口,但让HouseDogPetRock 都具有getNumberOfDressesgetNumberOfToys 方法。在多态情况下,Python 检查方法是否存在,仅在它们被调用时,而不是在编译时(不存在)或加载时检查类型。最大的优势是让您快速原型化,而无需担心形式,而您的实现尚未完成。

如果您确实需要正式的类型检查,您可以通过多种方式获得它,但没有一种是官方认可的。

【讨论】:

  • 这很有趣。感谢您的回复(赞成票)。但我会继续寻找,以防有其他方法。
  • 另一种方法是什么?您可以随意创建一个Pet 类作为接口,只是没有必要。
  • 另一种没有wiki 中显示的try-catch 块的方法。请记住,我对 Python 很陌生(不到一周)。所以我更愿意让我的好奇心占上风,探索各种可能性。如果我找不到其他方法,那也没关系。另外,感谢您编辑您的帖子。
  • 我不确定你指的是什么 try-catch 块
  • @kasavbere:如果您只以与束缚和纪律语言相同的方式传递有效参数,则不需要 try-catch 子句。是的,面对无效的参数,那些会在编译时抱怨 Python 不会,但我所知道的程序员中没有一个只是通过反复试验来传递参数,直到编译器停止抱怨。静态类型系统可以为您做一些有趣的事情(例如模式匹配或泛型),但是让某人确保他不会传递无效参数并不是这些有趣的事情之一。
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2015-08-03
  • 2012-12-23
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多