0

我正在使用 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 中,没有祖先关系的类可以实现相同的接口。请参阅以下示例中的HouseDog和。PetRock

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 是否有一种面向对象的方式来实现多态性而不使用继承?

4

1 回答 1

5

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

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

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

于 2012-11-24T18:36:33.693 回答