首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过继承和接口实现Python多态

通过继承和接口实现Python多态
EN

Stack Overflow用户
提问于 2012-11-25 02:33:00
回答 1查看 1.9K关注 0票数 0

我使用的是Python 2.7 (google应用程序引擎)

在学习Python时,我弄清楚了该语言是如何使用继承来实现多态性的。

PYTHON中的INHERITANCE-BASED多态性

代码语言:javascript
复制
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

JAVA中的INTERFACE-BASED多态性

代码语言:javascript
复制
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有没有一种面向对象的方式来实现多态而不使用继承?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-25 02:36:34

是的,他们叫它Duck Typing。不需要正式地实现接口。Java风格的接口不存在,因为Python有多重继承,所以如果您想定义接口,只需使用常规类作为超类型。但是,通常情况下,人们避免创建完全抽象的基类,而是利用鸭子类型。

对于您的示例,只需省略Pet接口,但让HouseDogPetRock都有getNumberOfDressesgetNumberOfToys方法。在多态的情况下,Python只在方法被调用时检查方法的存在,而不是在编译时(不存在)或加载时检查类型。最大的好处是让你在你的实现还没有完成的时候,不用担心形式主义的问题,就可以快速构建原型。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13544266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档