俗话说"龙生龙凤生凤老鼠的孩子会打洞",每种动物都有各自的特性,比如
老鼠会打洞
猫会爬树
鲨鱼会游泳
不同种类有不同的天性。而在 程序员 的思维中, 动物是对象, 天性是这个类方法或者属性。
再延伸一下,比如Python是面向对象编程语言。有List、Str、Dict、Tuple等数据类型,这些数据类型也是对象,比如List类可以有count方法,我们可以通过count方法统计列表中各个元素的数量。
我们可以简单的将定义类理解成就是定义数据结构,同时给这种数据结构制定一些独特的属性或者方法。我们先看最简单的类,在这里我们定义了Point类
#为了显示多个调用的变量 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = 'all' class Point(object): def __init__(self, x=0, y=0): self.x = x self.y = y def String(self): #显示Point的信息 return "{X:" + str(self.x) + ", Y:" + str(self.y) + "}"
调用类之前我们要实例化,这个可以理解成神笔马良画的画,如果不将其搞活,永远是画。通过实例化,调用实例,画中对象就活了。
#实例化Point类 point = Point(x=3, y=4) #显示point对象 point #显示point的String方法 point.String()
代码运行结果
<__main__.Point at 0x10d98ec18> '{X:3, Y:4}'
单继承
白马和黑马,都是马。
既然都是马,所以不论黑马白马都有马的特性,都可以奔跑。
所以我们可以定义一个基本的"马类",之后让"白马类"和"黑马类"继承自"马类"
像 白马
和 黑马
继承 马
,这就是单继承。因为只是继承了 一个 基类
。现在我们定义一个Circle类, 圆是由圆心和半径决定的,所以Circle会继承并使用Point的一些特性。
class Circle(Point): def __init__(self, x=0, y=0, radius=0): #Circle继承并使用Point的__init__函数 Point.__init__(self, x, y) #不同于Point的参数radius self.radius = radius def String(self): #显示Circle的信息 return Point.String(self) + ", {Radius:" + str(self.radius) + "}"
现在我们看看Circle
#实例化Circle类 circle = Circle(x=3, y=2, radius=5) #显示circle对象信息 circle #显示circle的String方法 circle.String()
代码运行结果
<__main__.Circle at 0x10d911c18> '{X:3, Y:2}, {Radius:5}'
多继承
多继承,顾名思义就是某个类继承了多个父类(基类)
class Size(object): def __init__(self, width, height): self.width = width self.height = height def String(self): return "{Width: " + str(self.width) + ", Height: " + str(self.height) + "}"
继续
#实例化Size对象 size = Size(width=5, height=3) size size.String()
运行结果
<__main__.Size at 0x10d97e828> '{Width: 5, Height: 3}'
现在已经有了Point、Size类,以及每个类中的String()方法。现在想构建 正四方形Rectangle类
。为了让Rectangle具有Point和Size的一些特性,需要让Rectangle继承Point和Size的一些特有的方法。
class Rectangle(Point, Size): def __init__(self, x, y, width, height): #让Rectangle使用Point中的init方法,使得Rectangle本身含有x和y属性值 Point.__init__(self, x, y) #让Rectangle使用Size中的init方法,使得Size本身含有width和height属性值 Size.__init__(self, width, height) def String(self): return "Rectangle's init point is " + Point.String(self) + "; Size is " + Size.String(self)
Rectangle
继承了 Point
和 Size
两个类,使得Rectangle不用定义 x、y、width、height
。而且 Rectangle的String方法
可以直接调用 Point和Size对象的String方法
。
#实例化Rectangle rect = Rectangle(x=0, y=0, width=5, height=3) #调用rect rect #显示其方法 rect.String()
运行结果
<__main__.Rectangle at 0x10d978390> "Rectangle's init point is {X:0, Y:0}; Size is {Width: 5, Height: 3}"
往期文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 028.Python面向对象继承(单继承,多继承,super,菱形继承)
- Java继承(面向对象篇)
- 《JavaScript面向对象精要》之五:继承
- JavaScript 面向对象高级——继承模式
- 码农上工06-Java面向对象-继承
- 组合还是继承,这是一个问题?——由模式谈面向对象的原则之多用组合、少用继承
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
追踪Linux TCP/IP代码运行
秦健 / 北京航空航天大学出版社 / 2010-4-1 / 69.00元
本书以应用程序为线索,详细描述了数据包在协议栈的分段、重组、发送、接收过程,同时分析了路由的初始化和设置过程,主要包括socket应用程序、 TCP/IP协议、路由、通知链、邻居子系统等内容。全书涵盖了协议栈的全部知识点,对于广大的读者来说这是一本极其难得的技术资料。同时,书中论述了网络设备的工作原理,解释了RTL8169和嵌入式CS8900、DM9000网卡设备的核心过程。一起来看看 《追踪Linux TCP/IP代码运行》 这本书的介绍吧!