Python程序设计-清华大学出版社-董付国第6章 面向对象程序设计.ppt_第1页
Python程序设计-清华大学出版社-董付国第6章 面向对象程序设计.ppt_第2页
Python程序设计-清华大学出版社-董付国第6章 面向对象程序设计.ppt_第3页
Python程序设计-清华大学出版社-董付国第6章 面向对象程序设计.ppt_第4页
Python程序设计-清华大学出版社-董付国第6章 面向对象程序设计.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 面向对象程序设计,针对大型软件的设计而提出,使得软件功能相对独立,能很好地做到代码重用。 Python完全采用了面向对象的思想,是真正面向对象的脚本语言,完全支持面向对象的基本功能,如封装、继承、多态以及对基类方法的覆盖或重写。 Python中对象的概念很广泛,对象不一定是某个类的实例。字符串、列表、字典、元组等内置数据类型不是类,但具有和类相似的语法。 创建类时用变量表示属性称为成员变量或成员属性,用函数表示方法称为成员函数或成员方法,成员属性和成员方法都称为类的成员,6.1 类的定义与使用,Python使用class保留字来定义类,类名的首字母一般要大写。如, class Car:

2、 #新式类必须有至少一个基类 def infor(self): print( This is a car ) 类的方法至少有一个参数self,并且必须是方法的第一个参数,self代表将来要创建的对象本身。在访问类的实例属性时需要以self为前缀,6.1 类的定义与使用,属性有两种,一种是实例属性,另一种是类属性。实例属性是在伪构造函数_init_中定义的,定义时以self作为前缀;类属性是在类中方法之外定义的属性。在主程序中(在类的的外部),实例属性属于实例(对象)只能通过对象名访问;类属性属于类可通过类名访问。 在类的方法中可以调用类的其它方法,可以访问类属性、对象属性。 类和对象都可以动态

3、地增加成员,6.1 类的定义与使用,class Car: price=100000 #定义类属性 def _init_(self, c): self.color=c #定义实例属性 car1=Car(Red) car2=Car(Blue) print car1.color, Car.price Car.price=110000 #修改类属性 C=QQ #增加类属性 car1.color=Yellow #修改实例属性 print car2.color, Car.price, C print car1.color, Car.price, C,6.1 类的定

4、义与使用,如果属性名以_开头则是私有属性,否则是公有属性。私有属性在类外不能直接访问。Python提供了访问私有属性的方式,可用于程序的测试和调试。 私有属性是为了数据封装和保密而设的属性,只能在类的成员方法(称为类的内部)中使用,通过self访问。公有属性是可以公开使用的,既可以在内部使用,也可以在外部(通过对象名访问)使用,class A: def _init_(self, value1 = 0, value2 = 0): self._value1 = value1 self._value2 = value2 def setValue(self, value1, value2): self

5、._value1 = value1 self._value2 = value2 def show(self): print self._value1 print self.value2 a = A() a._value1 0 a._A_value2 0,6.1 类的定义与使用,6.1 类的定义与使用,Python 用下划线作为变量前缀和后缀来表示特殊成员: _xxx:不能用from module import *导入,这样的对象叫做保护变量,只有类对象和子类对象能访问这些变量; _xxx_:系统定义名字 _xxx:类中的私有成员,只有类对象自己能访问,连子类对象也不能访问到这个成员。但在对象外

6、部可以通过对象名._类名_xxx来访问。Python中没有纯粹的C+意义上的私有成员。 在交互模式下,_表示解释器中最后一次显示的内容或最后一次语句正确执行的输出结果,6.1 类的定义与使用,class Fruit: def _init_(self): self._color=Red self.price=1 apple=Fruit() apple.price=2 print apple.price, apple._Fruit_color #访问私有成员 apple._Fruit_color=Blue #访问私有成员 print apple.price, apple._Fruit_color

7、#print(apple._color ) #不能直接访问私有属性 peach=Fruit() print peach.price, peach._Fruit_color,6.2 类的方法,类有4种方法:公有方法、私有方法、静态方法和类方法。 公有方法、私有方法都属于对象,每个对象都有自己的公有方法和私有方法,并且可以访问属于类和对象的成员; 公有方法通过对象名调用,私有方法不能通过对象名调用,只能在属于对象的方法中通过self调用; 静态方法和类方法都通过类名和对象名调用,但不能访问属于对象的成员,只能访问属于类的成员,6.2 类的方法,class Root: _total = 0 def

8、_init_(self,v): self._value = v Root._total += 1 def show(self): print self._value:,self._value print Root._total:,Root._total classmethod def classShowTotal(cls): print cls._total staticmethod def staticShowTotal(): print Root._total,6.2 类的方法,r = Root(3) r.classShowTotal() 1 r.staticShowTotal() 1 r

9、.show() self._value: 3 Root._total: 1 rr = Root(3) Root.classShowTotal() 2 Root.staticShowTotal() 2 Root.show() 出错信息 TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead) Root.show(r) self._value: 3 Root._total: 2 r.show() self._value: 3 Root._tot

10、al: 2,6.3 类的属性,Python2.x和Python3.x对属性的处理方式不一样,6.3.1 Python2.x中的属性,class Test: def _init_(self, value): self._value = value property def value(self): return self._value a = Test(3) a.value 3 a.value=5 #动态添加了新成员,隐藏了定义的属性 a.value 5 t._Test_value#原来的私有变量没有改变 3,6.3.1 Python2.x中的属性,class Test: def _init_(

11、self, value): self._value = value def _get(self): return self._value def _set(self, v): self._value = v value = property(_get, _set) def show(self): print self._value t = Test(3) t.value 3 t.value += 2 #动态添加了新成员 t.value #这里访问的是新成员 5 t.show() #访问原来定义的私有数据成员 3,6.3.1 Python2.x中的属性,class Test: def show(

12、self): print self.value print self._v t = Test() t.show() 出错信息 AttributeError: Test instance has no attribute value t.value = 3 t.show() 3 出错信息 AttributeError: Test instance has no attribute _Test_v t._v = 5 t.show() 3 出错信息 AttributeError: Test instance has no attribute _Test_v t._Test_v = 5 t.show(

13、) 3 5,6.3.2 Python3.x中的属性,class Test: def _init_(self, value): self._value = value property def value(self): return self._value t = Test(3) t.value 3 t.value = 5 出错信息 AttributeError: cant set attribute t.v=5 t.v 5 del t.v del t.value 出错信息 AttributeError: cant delete attribute t.value 3,6.3.2 Python3

14、.x中的属性,class Test: def _init_(self, value): self._value = value def _get(self): return self._value def _set(self, v): self._value = v value = property(_get, _set) t = Test(3) t.value 3 t.value = 5 t.value 5 del t.value 出错信息 AttributeError: cant delete attribute,6.3.2 Python3.x中的属性,class Test: def _i

15、nit_(self, value): self._value = value def _get(self): return self._value def _set(self, v): self._value = v def _del(self): del self._value value = property(_get, _set, _del) def show(self): print(self._value) t = Test(3) t.show() 3 t.value = 5 t.show() 5 del t.value t.show() 出错信息 AttributeError: T

16、est object has no attribute _Test_value t.value =1 t.show() 1,6.3.2 Python3.x中的属性,class Test: def show(self): print(self.value) print(self._v) t = Test() t.show() 出错信息 AttributeError: Test object has no attribute value t.value = 3 t.show() 3 出错信息 AttributeError: Test object has no attribute _Test_v

17、t._v = 5 t.show() 3 出错信息 AttributeError: Test object has no attribute _Test_v t._Test_v = 5 t.show() 3 5,6.4 类的特殊方法,构造函数:Python中类的(伪)构造函数是_init_,用来为属性设置初值,在建立对象时自动执行。如果用户没设计构造函数,Python将提供一个默认的构造函数。 析构函数:Python中类的析构函数是_del_,用来释放对象占用的资源,在Python收回对象空间之前自动执行。如果用户没设计析构函数,Python将提供一个默认的析构函数。 在Python中,运算符重

18、载是通过重写特殊函数来实现的,6.4 类的特殊方法,_init_():构造函数,生成对象时调用 _del_():析构函数,释放对象时调用 _add_()、_radd_():左+、右+ _sub_():- _mul_():* _div_():/ _mod_():% _pow_():* _cmp_():比较运算 _repr_():打印、转换 _setitem_():按照索引赋值 _getitem_():按照索引获取值 _len_():计算长度 _call_():函数调用 _contains_ ():测试是否包含某个元素 _getitem_ ():使用xkey索引操作符 _setitem_():索引

19、赋值 _eq_()、 _ne_()、 _lt_()、 _le_()、 _gt_()、 _ge_():=、 !=、 、 = _str_():转化为字符串,6.4 类的特殊方法,例1:重载运算符,自定义数组 MyArray.py,6.5 继承机制,继承是为代码重用而设计的,当我们设计一个新类时,为了代码重用可以继承一个已设计好的类。在继承关系中,原来设计好的类称为父类或基类,新设计的类称为子类或派生类。 派生类可以继承父类的共有成员,但是不能继承其私有成员。 Python支持多继承,如果父类中有相同的方法名,而在子类中使用时没有指定父类名,则Python解释器将从左向右进行搜索,6.5 继承机制,

20、import types class Person(object):#基类必须继承于object def _init_(self, name = , age = 20, sex = man): self.setName(name) self.setAge(age) self.setSex(sex) def setName(self, name): if type(name) != types.StringType: print name must be string. return self._name = name def setAge(self, age): if type(age) !=

21、 types.IntType: print age must be integer. return self._age = age def setSex(self, sex): if sex != man and sex != woman: print sex must be man or woman return self._sex = sex def show(self): print self._name print self._age print self._sex,6.5 继承机制,class Teacher(Person): def _init_(self, name=, age = 30, sex = man, department = Computer): super(Teacher, self)._init_(name, age, sex) #Person._init_(self, name, age, sex) self.setDepartment(department) def setDepartment(self, department): if type(department) != types.StringTy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论