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的距离。

以上

每天用一点时间,练习并写出练习过程

这样是对于学习的一个及时反馈

重在坚持!

/提供简单/方便/的练习手本/

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180407A15PWS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券