Python(四)–面向对象编程

类与对象

类的定义

class 类名:
  '可选的文档字符串'
  类成员

文档字符串是一个可选项,用于表示这个类的描述文字,类成员是类的属性和方法,参数self是一个隐含参数,类中方法必须要使用self作为参数后面介绍.
示例:

class Plane:
    '''
    This is a class about Plane.

        common bse class for all Planes
    '''
    def displayPlane(self):
        pass
  • Python类名有相应的命名规范:
    1.类名首字母需要大写.
    2.当类名由多个英文单词组成时,以大写字母分隔单词.
    3.不实用下划线”_”分隔单词.
  • Python类的属性的命名规范:
    1.使用谓词(动词+对像),说明对什么对象进行什么操作.
    2.首字母小写.
    3.以大写字母分隔单词.
  • 文档字符串(docstring)的作用是提供程序的帮助信息,可以不写.通常是一个多行字符串,首行以大写字母开始,以句号结尾,第二行是空行,第三行是详细的描述.可以通过”类名._doc_来访问”

类与对象

  • 类与函数不同,不能直接使用,而是需要创建实例对象后才能访问类属性和方法.
  • 对象的生命周期:
    1.首先需要定义类
    2.使用类创建对象,需要调用类的构造方法,构造方法的名称是_init_().创建新对象时系统会自动调用构造方法,传入新创建的对象,可以为对象的属性赋初始值.
    3.访问对象成员,包括属性和方法.
    4.销毁对象时调用析构方法,方法名是_del_(),传入要销毁的对象,回收对象所占用的资源.
    当需要初始化属性值时,构造方法是必须使用的,而析构方法在python中是可以不使用的,由系统自动调用即可.
  • 在定义方法时的”self”这个参数,表示的是类实例对象本身(相当于this).”self”作为类方法定义的第一个参数是隐含参数,调用方法时,不需要传入实参.
    示例:
#coding: utf-8
class Plane:
    '''
    This is a class about Plane.

        common bse class for all Planes
    '''
    pCount = 0
    def __init__(self,name,category):
        self.name = name
        self.category = category
        Plane.pCount+=1
    def displayPlane(self):
        print "name: ",self.name," , category: ",self.category

p1 = Plane("和谐号","波音747")
p1.displayPlane()
p2 = Plane("Python","空客A380")
p2.displayPlane()
print "Plane's count is %d" % Plane.pCount
  • Python允许在任何时候添加,修改或删除类和对象的属性,使用赋值运算符可以为类对象添加,修改属性值,使用del语句可以删除类对象的属性,语法格式如下:
del 类名.属性名

示例:

p1.carryNum = 350
print "p1'carryNum is ",p1.carryNum
  • 类属性
    类属性可分为类属性和实例属性.
    类属性是与类绑定的,不依赖于对象,又称为静态属性.它不需要实例化对象,雷和对象都可访问获取其值.前面示例中qCount就是个类属性.
    而实例属性存在于对象中,必须先创建对象,再访问获取其值,不能通过类访问实例属性.
    当通过对象访问某个属性时,解释器会先尝试在实例命名空间中寻找.如果找不到就回去类属性中查找.
    注意:使用对象访问类属性时,只能读取而不能修改.当试图通过对象给类属性赋值时,解释器会理解为给对象的实例属性赋值.如果对象没有该实例属性,会自动给对象创建一个与类属性同名的实例属性.
  • 内置属性
    类中已经内置了一些属性和方法,任何类都可以自己访问.使用内置函数dir()可以返回类属性列表(输出类的属性).使用类的字典属性_dict_可以返回一个字典(属性的字典数据),键是属性名,值是相对应的属性对象的数据值.

类属性

说明

_dict_

类的命名空间

_doc_

类的文档字符串,如果没有定义,为None

_name_

类名称

_moudule_

在类中定义的模块名称,交互模式其值为_main_

_bases_

一个可能是空的元组,包含了其在基类列表出现的顺序

_class_

可以获得对象所对应的类名

- 方法
类中定义的方法有三种,实例方法,类方法和静态方法.
1.实例方法:与类绑定且依赖于对象.
2.类方法:与类绑定,不依赖于对象,不需要实例化对象,类和其对象可以调用执行.定义类方法的语法是使用装饰器@classmethod,类方法名的参数中第一个需要使用隐含参数cls.
语法:@classmethod
类方法名(cls, 参数列表)
3.静态方法:与类方法类似,不同之处为采用了@staticmethod装饰,且没有隐含cls参数.

类的封装,继承,多态

类的封装

  • 封装性
    封装是蒋某些东西包装隐藏起来,让外界无法直接使用,只能通过某些特定的方法才能访问.被封装的特性只能通过特定的行为去访问,以保证对象的数据独立性,隐藏性和安全性,并且利于后期的维护.
  • 封装的使用
    Python解释器对下划线有特殊的解释,名称前以单下划线”_”为前缀的属性和方法被解释为非公开的(),名称前以双下划线”__”作为对象属性名称前缀的属性被隐藏起来,外界将无法直接查看和修改该属性,需要通过方法对属性进行修改.
    补充:”单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
    “双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

类的继承

  • 继承性
    继承可以分为单继承和多继承,
    单继承语法:
class 子类(父类):
    '类文档字符串'
    def __int__(self,参数列表1):
        父类.__init__(self,参数列表2):
        ....
    子类新增的类成员

示例:

class AvionPlane(Plane):
    def __init__(self,_name,_categry,__gun):
        Plane.__init__(self,_name,_categry)
        self.__gun = __gun
    def setGun(self,__gun):
        self.__gun = __gun
  • 继承的使用
    子类对象可以调用父类的方法也可以调用自己的特有的方法.

类的多态

当调用的方法在子类和父类中同名时,会产生不同的结果,子类会优先调用自己重写后的方法.