- class Point:
- def __str__(self):
- return '({}, {})'.format(self.__x, self.__y)
- class Circle(Shape):
- pass
那么它将持续父类 Shape 的 area:
- >>> Shape.area is Circle.area
- True
一旦 Circle 定义了本身的 area,大年夜 Shape 持续而来的那个 area 就被重写(overwrite)了:
用法比较直接:
举一个教科书中最常见的例子。Circle 和 Rectangle 持续自 Shape,不合的图形,面积(area)计算方法不合。
- >>> from shape import *
- >>> Shape.area is Circle.area
- False
经由过程类的字典更能明显地看清这一点:
所以,子类重写父类的办法,其实只是把雷同的属性名绑定到了不合的函数对象。可见 Python 是没有覆写(override)的概念的。
同理,即使 Shape 没有定义 area 也是可以的,Shape 作为“接口”,并不克不及获得语法的包管。
甚至可以动态的添加办法:
- class Circle(Shape):
- ...
- # def area(self):
- # return math.pi * self.r * self.r
- # 为 Circle 添加 area 办法。
- Circle.area = lambda self: math.pi * self.r * self.r
动态说话一般都是这么灵活,Python 也不例外。
Python 官方教程「9. Classes」第一句就是:
Python 以起码的新的语法和语义实现潦攀类机制,这一点确切让人赞叹,然则也让 C++ / Java 法度榜样员认为颇为不适。
不难看出,交互模式在打印 p 时其实是调用了 repr(p):
多态
如前所述,Python 没有覆写(override)的概念。严格来讲,Python 并不支撑「多态」。
为懂得决持续构造中接口和实现的问题,或者说为了更好的用 Python 面向接口编程(设计模式所倡导的),我们须要工资的设一些规范。
- >>> Shape.__dict__['area']
- <function Shape.area at 0x0000000001FDB9D8>
- >>> Circle.__dict__['area']
- <function Circle.area at 0x0000000001FDBB70>
以内建模块 asyncio 为例,AbstractEventLoop 原则上是一个接口,类似于 Java 中的接口或 C++ 中的纯虚类,然则 Python 并没有语法去包管这一点,为了尽量表现 AbstractEventLoop 是一个接口,起首在名字上标记它是抽象的(Abstract),然后让每个办法都抛出异常 NotImplementedError。
- class AbstractEventLoop:
- def run_forever(self):
- raise NotImplementedError
- ...
- loop = asyncio.AbstractEventLoop()
- try:
- loop.run_forever()
推荐阅读
在这个语法树构造中,body里包含着if构造中的语句return HttpResponse("2"),type为Compare表示该构造体为断定语句,left表示左值即源码中的type,test构造体中则是用来进行if断定,test中的ops对应着>>>详细阅读
本文标题:浅析Python的类、继承和多态
地址:http://www.17bianji.com/lsqh/36335.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示