python 面向对象、类、对象

2023-01-31 01:01:53 python 对象 面向对象

class 类
object 对象
object-oriented programming 面向对象,简称OOP
attribute 属性
method 方法
inheritance 继承

python中通过类和对象来实现 面向对象的编程
面向对象编程,最重要、主要的目的是:提高程序的重复使用性,这和函数的目的类似
Python中一切皆对象,类也是对象

类是属性相近对象的归类
在人类认知中,会根据属性相近把‘东西归类,并且给‘类别‘命名
比如鸟类共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都是建立在鸟类的原型基础上
面向对象就是模拟了以上人类认知的过程。在python中,上述的‘东西称为对象

定义鸟类 

  1. class Bird(object):#类,鸟;类  
  2.     have_feather = True#变量,羽毛;属性  
  3.     way_of_reproduction  = 'egg'#变量,生殖方式;属性  

定义类,名字鸟
该‘类别’中定义变量,1是否有羽毛,2生殖方式
这2个变量对应我们之前所说的属性

假如我养了一只小鸡,叫summer。他是个对象,属于鸟类。使用前面定义的类  

  1. summer = Bird()#创建对象,初始化类 
  2. print summer.way_of_reproduction#调用类属性 

第一句赋值语句,创建了对象并说明summer是类中的一个对象, summer就有了鸟的类属性'
对属性的引用是通过 对象.属性(object.attribute)的形式来实现


2 类属性可以是变量,也可以是方法(动作)
在人类日常认知中,我们在通过属性识别‘类别‘的时候,有时候会根据这个’东西’能做什么事情来区分类别
比如,鸟类会移动(这样就可以和房屋的类别区分开了)。而这些动作又会带来一定的结果,比如通过移动会带来位置的变化

python中,这样的属性称为方法。python中通过在’类内部定义函数’,来说明方法

  1. class Bird(object): 
  2.     have_feather = True 
  3.     way_of_reproduction = 'egg' 
  4.     def move(self, dx, dy):#属性,表现:类的函数 
  5.         position = [0,0] 
  6.         position[0] = position[0] + dx 
  7.         position[1] = position[1] + dy 
  8.         return position 
  9.  
  10. summer = Bird() 
  11. print 'after move:',summer.move(5,8)#调用类的函数(方法) 

单独函数称为普通函数,简称函数
类的函数(其实也是类的属性,只不过是一个特殊的属性),被称为类的方法,简称方法
(括号中的object,当括号中为object时,说明这个类没有父类(到头了))

该处,类’鸟‘新增一个属性,即移动(类的函数move)
(函数/方法有一个参数self,是为了方便引用对象自身,函数/方法也是对象),函数/方法的第一个参数必须为self,无论是否用到
另外2个参数,dx dy表示在2个方向移动的距离,move方法会最终返回运算过的position
另外调用move方法时,只传递了dx dy的值,不需要传递self参数(因为slef参数只是为了内部使用)


3 类别本身还可以进一步细分成子类
比如说,鸟类可以进一步分成鸡,大雁,黄鹂
在OOP中,我们通过继承来表达上述概念

  1. class Chicken(Bird):#类,鸡;类;继承基/父类‘鸟’  
  2.     way_of_move = ‘walk’#变量,移动方式;属性  
  3.     possible_in_KFC = True  
  4.   
  5. class Oriole(Bird):#类,黄鹂;类;继承基/父类‘鸟’  
  6.     way_of_move = 'fly'  
  7.     possible_in_KFC = False  
  8.   
  9. summer = Chicken()  
  10. print summer.have_feather#调用基/父类属性  
  11. print summer.move(5,8)  
我们新定义的鸡(Chicken)类的,新增加了两个属性,移动方式(way_of_move)和可能在KFC找到(possible_in_KFC)
在类定义时,括号里改为了Bird,用来说明,Chicken是属于鸟类(Bird)的一个子类(Chicken继承自Bird),而自然而然,Bird就是Chicken的父类。通过这个声明,python就知道,Chicken具有Bird的所有属性。我们可以看到,尽管我只声明了summer是鸡类,它依然具有鸟类的属性(无论是变量属性have_feather还是方法属性move)
另外定义黄鹂(Oriole)类,同样继承自鸟类。这样,我们在有一个属于黄鹂的对象时,也会自动拥有鸟类的属性

通过继承制度,我们可以避免程序中的重复信息和重复语句。(如果我们分别定义两个类,而不继承自鸟类,那么我们就必须把鸟类的属性分别敲到鸡类和黄鹂类的定义中) 

所以说,面向对象提高了程序的可重复使用性
我们可以看到,面向对象实际上基于人类认知时的习惯,将各种各样的东西分类,从而了解世界。我们从祖先开始可能已经练习了这个认知过程有几百万年,所以面向对象是很符合人类思维习惯的编程方法。所谓面向过程(也就是执行完一个语句再执行下一个)实际上是机器思维。通过面向对象的编程,我们实际上是更贴近我们自然的思维方式,也更方便和其他人交流我们程序里所包含的想法,甚至于那个人并不是程序员 

 

总结
将东西根据属性归类 ( 将object归为class )
方法是一种属性,表示动作
用继承来说明父类-子类关系。子类自动具有父类的所有属性。
self代表了根据该类定义而创建的对象。

建立对一个对象: 对象名 = 类名()
引用对象的属性: object.attribute

作者:Vamei 出处:Http://www.cnblogs.com/vamei 

相关文章