入住 CI 中国社区 登录
CodeIgniter 中国开发者社区 返回首页

rosemarry的个人空间 https://codeigniter.org.cn/forums/?39678 [收藏] [复制] [分享] [RSS]

日志

python系列之面向对象

已有 760 次阅读2016-3-24 13:43 |个人分类:python

我们之前已经写了不少小程序,都是按照功能需求的顺序来设计程序,这种被称为"面向过程"的编程

还有一种程序设计的方法,把数据和对数据的操作用一种叫做"对象"的东西包裹起来。这种被称为"面向对象"的编程。这种方法更适合较大型的程序开发。

面向对象编程最主要的两个概念就是:类(class)和对象(object)

类是一种抽象的类型,而对象是这种类型的实例

一个类可以有属于它的函数,这种函数被称为类的"方法"。一个类/对象可以有属于它的变量,这种变量被称作"域"。域根据所属不同,又分别被称作"类变量"和"实例变量"。

域和方法被合称为类的属性。

python是一种高度面向对象的语言,它其中的所有东西其实都是对象,所以我们之前也一直使用着对象。

关键字class加上类名用来创建一个类。之后缩进的代码块是这个类的内部。

类名加圆括号()的形式可以创建一个类的实例,也就是被称作对象的东西。

调用类变量的方法是"对象.变量名".你可以得到它的值,也可以改变它的值。

注意到:

       类方法和我们之前定义的函数区别在于,第一个参数必须为self。而在调用类方法的时候,通过"对象.方法名()"格式进行调用,而不需要额外提供self这个参数的值,self在类方法中,就是你调用的这个对象本身。

      面向过程的方法,你可能需要写两个函数,然后把数据作为参数传递进去,在调用的时候要搞清应该使用哪个函数和哪些数据。有了面向对象,你可以把相关的数据和方法封装在一起,并且可以把不同类中的相同功能整合起来。这就需要用到面向对象中的另一个重要概念:继承

class Vehicle:
 def __init__(self,speed):
  self.speed = speed
 def drive(self,distance):
  print('need%2f hour(s)'%(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('need %f fuels'%(distance * self.fuel))

b=Bike(15.0)
c=Car(80.0,0.012)
b.drive(100.0)
c.drive(100.0)

__int__函数[注意这里是两个下划线]会在类被创建的时候自动调用,用来初始化类。它的参数,要在创建类的时候提供。

class定义后面的括号里表示这个类继承于哪个类。Bike(Vehicle)就是说Bike是继承自Vehicle中的子类。Vehicle中的属性和方法,Bike都会有。

因为Bike不需要有额外的功能,所以用pass在类中保留空缺,什么都不用写。

Car类中,我们又重新定义了__init__和drive函数,这样会覆盖掉它继承自Vehicle的同名函数。但我们依然可以通过"Vehicle.函数名"来调用它的超类方法。以此来获得它作为Vehicle所具有的功能。注意,因为是通过类名调用方法,而不是像之前一样通过对象来调用,所以这里必须提供self的参数值。在调用超类的方法后,我们又给Car增加了一个fuel属性,并在drive中多输出一行信息。

最后,我们分别创建一个速度为15的自行车对象,和一个速度为80,耗油量为0.012的汽车,然后让他们去行驶100的距离


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 入住 CI 中国社区