java - Python 通过继承和接口(interface)实现多态

标签 java python interface polymorphism

我正在使用 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中,没有祖先关系的类可以实现相同的接口(interface)。请参阅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有面向对象的方法来实现多态性而不使用继承吗?

最佳答案

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

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

如果您确实想要进行正式的类型检查,可以通过多种方式进行,但没有一种方式得到正式批准。

关于java - Python 通过继承和接口(interface)实现多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13544266/

相关文章:

java - 列出所有未报告的异常(包括父类(super class)声明异常的异常)

java - 如何创建包含 100 个随机整数的一维数组并求平均值、标准差和方差?

python - 如何在 PDF 文档中插入 SVG 文件?

java - Set 中的 Get 和 Set 方法

java - Java中接口(interface)实现的继承

java - 系统异常: Got an unexpected error in callout : null

java - 为什么 HashMap 会重新哈希键对象提供的哈希码?

python httplib2 证书验证失败

Python - 将内置函数与创建的函数联系起来

pointers - 从 reflect.Value 中提取 uintptr