python面向对象玩法(python二十面向对象)
开始每一次的学习,尽量做到三点:
-
温故知新,或是预习今天知识中涉及到的老知识点,或是上一节所学习的;
-
认真学习本堂课的知识点,最好能达到可以给别人讲清楚的程度;
-
结合本节的内容,做练习题,以达到学以致用的效果。
我之前所有关于python所写的代码,都是面向过程,这样很容易理解,我们想要代码达到什么效果,就直接写一个,但是面对庞大的功能组件的大程序中,很可能这种方法不是最好的。今天接触面向对象更适合较大型的程序开发,面向对象是一个很重要的概念,我也没有深入的理解,只能管窥蠡测,慢慢一步步了解。所以,我们就从接触它开始吧。
面向对象编程最主要的两个概念就是:类(class)和对象(object)
类是一种抽象的类型,而对象是这种类型的实例。
首先创建一个类:
class MyClass:
pass
mc = MyClass()
print mc
关键字class加上类名用来创建一个类。之后缩进的代码块是这个类的内部。在这里,我们用pass语句,表示一个空的代码块。
类名加圆括号()的形式可以创建一个类的实例,也就是被称作对象的东西。我们把这个对象赋值给变量mc。于是,mc现在就是一个MyClass类的对象。
我们给这个类加上一些域:
class MyClass:
name = 'ning'
def sayHi(self):
print 'Hello %s' % self.name
mc = MyClass()
print mc.name
mc.name = 'alan'
mc.sayHi()
我们给MyClass类增加了一个类变量name,并把它的值设为'ning'。然后又增加了一个类方法sayHi。
调用类变量的方法是“对象.变量名”。你可以得到它的值,也可以改变它的值。
注意到,类方法和我们之前定义的函数区别在于,第一个参数必须为self。而在调用类方法的时候,通过“对象.方法名()”格式进行调用,而不需要额外提供self这个参数的值。self在类方法中的值,就是你调用的这个对象本身。
以下就用一个例子从简单到复杂来感受一下:
【一】
假设我们有一辆汽车,我们知道它的速度(60km/h),以及A、B两地的距离(100km)。要算出开着这辆车从A地到B地花费的时间。
面向过程的方法:
speed = 60.0
distance = 100.0
time = distance / speed
print time
面向对象的方法:
class Car:
speed = 0
def drive(self, distance):
time = distance / self.speed
print time
car = Car()
car.speed = 60.0
car.drive(100.0)
【二】
假设我们又有了一辆更好的跑车,它的速度是150km/h,然后我们除了想从A到B,还要从B到C(距离200km)。要求分别知道这两种车在这两段路上需要多少时间。
面向过程的方法:
speed1 = 60.0
distance1 = 100.0
time1 = distance1 / speed1
print time1
distance2 = 200.0
time2 = distance2 / speed1
print time2
speed2 = 150.0
time3 = distance1 / speed2
print time3
time4 = distance2 / speed2
print time4
面向对象的方法:
class Car:
speed = 0
def drive(self, distance):
time = distance / self.speed
print time
car1 = Car()
car1.speed = 60.0
car1.drive(100.0)
car1.drive(200.0)
car2 = Car()
car2.speed = 150.0
car2.drive(100.0)
car2.drive(200.0)
【三】
仍然是从A地到B地,这次除了有汽车,我们还有了一辆自行车!
自行车和汽车有着相同的属性:速度(speed)。还有一个相同的方法(drive),来输出行驶/骑行一段距离所花的时间。但这次我们要给汽车增加一个属性:每公里油耗(fuel)。而在汽车行驶一段距离的方法中,除了要输出所花的时间外,还要输出所需的油量。
我们要使用的方法是,创建一个叫做Vehicle的类,表示某种车,它包含了汽车和自行车所共有的东西:速度,行驶的方法。然后让Car类和Bike类都继承这个Vehicle类,即作为它的子类。在每个子类中,可以分别添加各自独有的属性。
Vehicle类被称为基本类或超类,Car类和Bike类被成为导出类或子类。
class Vehicle:
def __init__(self, speed):
self.speed = speed
def drive(self, distance):
print '需要用 %f 小时' % (distance / self.speed)
class Bike(Vehicle):
pass
class Car(Vehicle):
def __init__(self, speed, fuel):
Vehicle.__init__(self, speed)
self.fuel = fuel
def drive(self, distance):
Vehicle.drive(self, distance)
print '需要 %f 耗油' % (distance * self.fuel)
b = Bike(15.0)
c = Car(80.0, 0.012)
b.drive(100.0)
c.drive(100.0)
解释一下代码:
__init__函数会在类被创建的时候自动调用,用来初始化类。它的参数,要在创建类的时候提供。于是我们通过提供一个数值来初始化speed的值。
注意:__init__是python的内置方法,类似的函数名前后是两个下英文划线,如果写错了,则不会起到原本应有的作用。
class定义后面的括号里表示这个类继承于哪个类。Bike(Vehicle)就是说Bike是继承自Vehicle中的子类。Vehicle中的属性和方法,Bike都会有。因为Bike不需要有额外的功能,所以用pass在类中保留空块,什么都不用写。
Car类中,我们又重新定义了__init__和drive函数,这样会覆盖掉它继承自Vehicle的同名函数。但我们依然可以通过“Vehicle.函数名”来调用它的超类方法。以此来获得它作为Vehicle所具有的功能。注意,因为是通过类名调用方法,而不是像之前一样通过对象来调用,所以这里必须提供self的参数值。在调用超类的方法之后,我们又给Car增加了一个fuel属性,并且在drive中多输出一行信息。
最后,我们分别创建一个速度为15的自行车对象,和一个速度为80、耗油量为0.012的汽车,然后让它们去行驶100的距离。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com