Python程序设计-清华大学出版社-董付国第6章-面向对象程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章面向对象程序设计针对大型软件的设计而提出,使得软件功能相对独立,能很好地做到代码重用。Python完全采用了面向对象的思想,是真正面向对象的脚本语言,完全支持面向对象的基本功能,如封装、继承、多态以及对基类方法的覆盖或重写。Python中对象的概念很广泛,对象不一定是某个类的实例。字符串、列表、字典、元组等内置数据类型不是类,但具有和类相似的语法。创建类时用变量表示属性称为成员变量或成员属性,用函数表示方法称为成员函数或成员方法,成员属性和成员方法都称为类的成员。6.1类的定义与使用Python使用class保留字来定义类,类名的首字母一般要大写。如,classCar:#新式类必须有至少一个基类definfor(self):print(Thisisacar)类的方法至少有一个参数self,并且必须是方法的第一个参数,self代表将来要创建的对象本身。在访问类的实例属性时需要以self为前缀。6.1类的定义与使用属性有两种,一种是实例属性,另一种是类属性。实例属性是在伪构造函数__init__中定义的,定义时以self作为前缀;类属性是在类中方法之外定义的属性。在主程序中(在类的的外部),实例属性属于实例(对象)只能通过对象名访问;类属性属于类可通过类名访问。在类的方法中可以调用类的其它方法,可以访问类属性、对象属性。类和对象都可以动态地增加成员6.1类的定义与使用classCar:price=100000#定义类属性def__init__(self,c):self.color=c#定义实例属性car1=Car(Red)car2=Car(Blue)printcar1.color,Car.priceCar.price=110000#修改类属性Car.name='QQ'#增加类属性car1.color=Yellow#修改实例属性printcar2.color,Car.price,Car.nameprintcar1.color,Car.price,Car.name6.1类的定义与使用如果属性名以__开头则是私有属性,否则是公有属性。私有属性在类外不能直接访问。Python提供了访问私有属性的方式,可用于程序的测试和调试。私有属性是为了数据封装和保密而设的属性,只能在类的成员方法(称为类的内部)中使用,通过self访问。公有属性是可以公开使用的,既可以在内部使用,也可以在外部(通过对象名访问)使用。classA:def__init__(self,value1=0,value2=0):self._value1=value1self.__value2=value2defsetValue(self,value1,value2):self._value1=value1self.__value2=value2defshow(self):printself._value1printself.value2a=A()a._value10a._A__value206.1类的定义与使用6.1类的定义与使用Python用下划线作为变量前缀和后缀来表示特殊成员:_xxx:不能用'frommoduleimport*'导入,这样的对象叫做保护变量,只有类对象和子类对象能访问这些变量;__xxx__:系统定义名字__xxx:类中的私有成员,只有类对象自己能访问,连子类对象也不能访问到这个成员。但在对象外部可以通过对象名._类名__xxx来访问。Python中没有纯粹的C++意义上的私有成员。在交互模式下,_表示解释器中最后一次显示的内容或最后一次语句正确执行的输出结果。6.1类的定义与使用classFruit:def__init__(self):self.__color='Red'self.price=1apple=Fruit()apple.price=2printapple.price,apple._Fruit__color#访问私有成员apple._Fruit__color=Blue#访问私有成员printapple.price,apple._Fruit__color#print(apple.__color)#不能直接访问私有属性peach=Fruit()printpeach.price,peach._Fruit__color6.2类的方法类有4种方法:公有方法、私有方法、静态方法和类方法。公有方法、私有方法都属于对象,每个对象都有自己的公有方法和私有方法,并且可以访问属于类和对象的成员;公有方法通过对象名调用,私有方法不能通过对象名调用,只能在属于对象的方法中通过self调用;静态方法和类方法都通过类名和对象名调用,但不能访问属于对象的成员,只能访问属于类的成员。6.2类的方法classRoot:__total=0def__init__(self,v):self.__value=vRoot.__total+=1defshow(self):print'self.__value:',self.__valueprint'Root.__total:',Root.__total@classmethoddefclassShowTotal(cls):printcls.__total@staticmethoddefstaticShowTotal():printRoot.__total6.2类的方法r=Root(3)r.classShowTotal()1r.staticShowTotal()1r.show()self.__value:3Root.__total:1rr=Root(3)Root.classShowTotal()2Root.staticShowTotal()2Root.show()出错信息TypeError:unboundmethodshow()mustbecalledwithRootinstanceasfirstargument(gotnothinginstead)Root.show(r)self.__value:3Root.__total:2r.show()self.__value:3Root.__total:26.3类的属性Python2.x和Python3.x对属性的处理方式不一样。6.3.1Python2.x中的属性classTest:def__init__(self,value):self.__value=value@propertydefvalue(self):returnself.__valuea=Test(3)a.value3a.value=5#动态添加了新成员,隐藏了定义的属性a.value5t._Test__value#原来的私有变量没有改变36.3.1Python2.x中的属性classTest:def__init__(self,value):self.__value=valuedef__get(self):returnself.__valuedef__set(self,v):self.__value=vvalue=property(__get,__set)defshow(self):printself.__valuet=Test(3)t.value3t.value+=2#动态添加了新成员t.value#这里访问的是新成员5t.show()#访问原来定义的私有数据成员36.3.1Python2.x中的属性classTest:defshow(self):printself.valueprintself.__vt=Test()t.show()出错信息AttributeError:Testinstancehasnoattribute'value't.value=3t.show()3出错信息AttributeError:Testinstancehasnoattribute'_Test__v't.__v=5t.show()3出错信息AttributeError:Testinstancehasnoattribute'_Test__v't._Test__v=5t.show()356.3.2Python3.x中的属性classTest:def__init__(self,value):self.__value=value@propertydefvalue(self):returnself.__valuet=Test(3)t.value3t.value=5出错信息AttributeError:can'tsetattributet.v=5t.v5delt.vdelt.value出错信息AttributeError:can'tdeleteattributet.value36.3.2Python3.x中的属性classTest:def__init__(self,value):self.__value=valuedef__get(self):returnself.__valuedef__set(self,v):self.__value=vvalue=property(__get,__set)t=Test(3)t.value3t.value=5t.value5delt.value出错信息AttributeError:can'tdeleteattribute6.3.2Python3.x中的属性classTest:def__init__(self,value):self.__value=valuedef__get(self):returnself.__valuedef__set(self,v):self.__value=vdef__del(self):delself.__valuevalue=property(__get,__set,__del)defshow(self):print(self.__value)t=Test(3)t.show()3t.value=5t.show()5delt.valuet.show()出错信息AttributeError:'Test'objecthasnoattribute'_Test__value't.value=1t.show()16.3.2Python3.x中的属性classTest:defshow(self):print(self.value)print(self.__v)t=Test()t.show()出错信息AttributeError:'Test'objecthasnoattribute'value't.value=3t.show()3出错信息AttributeError:'Test'objecthasnoattribute'_Test__v't.__v=5t.show()3出错信息AttributeError:'Test'objecthasnoattribute'_Test__v't._Test__v=5t.show()356.4类的特殊方法构造函数:Python中类的(伪)构造函数是__init__,用来为属性设置初值,在建立对象时自动执行。如果用户没设计构造函数,Python将提供一个默认的构造函数。析构函数:Python中类的析构函数是__del__,用来释放对象占用的资源,在Python收回对象空间之前自动执行。如果用户没设计析构函数,Python将提供一个默认的析构函数。在Python中,运算符重载是通过重写特殊函数来实现的。6.4类的特殊方法__init__():构造函数,生成对象时调用__del__():析构函数,释放对象时调用__add__()、__radd__():左+、右+__sub_

1 / 30
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功