python 面向对象、类、对象

发布时间:2019-07-24 09:53:46编辑:auto阅读(1517)

    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 

关键字