俗话说"龙生龙凤生凤老鼠的孩子会打洞",每种动物都有各自的特性,比如
老鼠会打洞
猫会爬树
鲨鱼会游泳
不同种类有不同的天性。而在 程序员 的思维中, 动物是对象, 天性是这个类方法或者属性。
再延伸一下,比如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面向对象-继承
- 组合还是继承,这是一个问题?——由模式谈面向对象的原则之多用组合、少用继承
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Release It!
Michael T. Nygard / Pragmatic Bookshelf / 2007-03-30 / USD 34.95
“Feature complete” is not the same as “production ready.” Whether it’s in Java, .NET, or Ruby on Rails, getting your application ready to ship is only half the battle. Did you design your system to......一起来看看 《Release It!》 这本书的介绍吧!