版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2 Python面向对象 错误!未定义书签。 面向对象技术简介 创建类 实例 5卅代表类的实例,耐淡 创建实例对象 访问属性 Python内置类属性 python对象销毁(垃圾回收) 实例 类的继承 方法重写 10 基础重载方法 11 运算符重载 11 类属性与方法 12 类的私有属性 12 类的方法 12 类的私有方法 12 实例 单下划线.双下划线.头尾双下划线说明: Python面向对象 面向对象技术简介 类(Class):用来描述具有相同的厲性和方法的对象的集合。它定义了该集合中每个对象所共有的厲性和方法。对 象是类的实例。 类变量:类变量在整个实例化的对象中是公用的。类变星走义在类中
2、且在函数体之外。类变星通常不作为实例变 量使用。 数据成员:类变量或者实例变長用于处理类及其实例对象的相关的数据。 方法重载:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖 (override ),也称为方法的重载。 实例变蜃:定义在方法中的变S,只作用于当前实例的类。 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象 作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟是一个 (is-a ) 关系(例图,Dog 是一个 Animal)。 实例化:
3、创建一个类的实例,类的具体对象。 方法:类中走义的函数。 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变畳和实例变量)和方法。 创建类 使用class语句来创建一个新类,class之后为类的名称并以S号结尾,如下实例: class ClassName: 类的帮助信息#类文档字符串 class_suite # 类体 类的帮助倍息可以通过ClassName_doc_查看。 class-suite由类成员,方法,数据厲性组成。 实例 以下是一个简单的python类实例: #coding=utf8 class Empioyee: 所有员工的基类 empCOUnt = 0 def _init
4、_(selfname salary): = name self.salary = salary Employee.empCount += 1 def displayCount(self): ppint Total Employee %d % EmpioyeeempCount def displayEmployee(self): print Name :seifnameSalary:self.salary empCount变量是一个类变量,它的值将在这个类的所有实例之间共拿。你可以在内鹹或外畔使用 Empio yee.em pCount 访问。 第一种方方法是一种特殊的方法,
5、被称为类的构造函数或初始化方法,当创建了这个类的实例时就会 调用该方法 self代表类的实例,self在走义类的方法时是必须有的,虽然在调用时不必传入相应的参数。 孔If代表类的实例,而非类 类的方法与普通的函数只有一个特别的区别它们必须有一个额外的第一个参数名称,按照惯例它的名称是 self。 class Test: def prt(self): print(self) print(self._class_) t = Test() t.prtO 以上实例执行结果为: main .Test 从执行结果可以很明显的岀,self代表的是类的实例,代表当前又蟻的地址,而selfxlass则Jg向类。
6、 self不是python关键宇,我他换成wScschool也是可以正常执行的: 实例: class Test: def prt(w3cschool): print(w3cschool) print(w3cschool._class_) t = Test() t.prtO 以上实例执行结果为: main .Test 创建实例对象 要创建一个类的实例,你可以使用类的名称并通过_让_方法接受参数。 创建Employee类的第一个对象“ empl = Employee(Zana, 2000) “创建Employee类的第二个对象 emp2 = Employee( Manni 5000) 访问属性 您
7、可以使用点()来访问对象的厲性。使用如下类的名称访问类变i: empldisplayEmployee() emp2displayEmployee() ppint Total Employee %d % Employee.empCount 完整实例: #coding=utf-8 #!/usr/bin/python class Employee: 所有员工的基类 empCount = 0 def _init_(selfname salary): = name self.salary = salary Employee.empCount += 1 def displayCount
8、(self): print Total Employee %d % Employee.empCount def displayEmployee(self): ppint Name : , Salary:self.salary 临U建Employee类的第一个对象“ empl = Employee( Zana* 2000) “创建Employee类的第二个对象 emp2 = Employee(Manni 5000) empldisplayEmployee() emp2displayEmployee() ppint Total Employee %d % Employee.emp
9、Count 执行以上代码输出结果如下: Name : Zara ,Salary;2000 Name : Manni ,Salary:5000 Total Employee 2 你可以添加,删除 修改类的属性,如下所示: empl.age = 7 # 添加一个age属性 empl.age = 8 # 修改age属性 del empl.age # 删除age属性 你也可以使用以下函数的方式来访问厲性: getattr(oty, name, default):访问对象的属性。 hasattr(obj,name):检查是否存在一个厲性。 setattr(obj,name,value):设置一个厲性.如
10、果厲性不存在,会创建新厲性。 delattr(obj, name):删除属性。 hasattr(empl, age) #如果存在agJ 属性返回Trueo getattr(empl, age) #返回age,属性的值 setattr(empl, age, 8) #添加属性age,值为8 delattr(empl age) #删除属性age, Python内置类属性 dict_:类的属性(包含一个字典,由类的数据厲性组成) _doc_ :类的文档宇符串 name_:类名 _module_:类走义所在的模块(类的全名是_main_.className,如果类位 导入横块mymod中,那 么 cla
11、ssName_module_ 等于 mymod ) bases_:类的所有父类构成元素(包含了以个由所有父类组成的元组) Python内置类厲性调用实例如下: #coding=utf-8 #!/usr/bin/python class Employee: 所有员工的基类 empCount = 0 def _init_(selfname salary): = name self.salary = salary Employee.empCount += 1 def displayCount(self): ppint Total Employee %d % Employee.em
12、pCount def displayEmployee(self): print Name :selfname Salary:self.salary print print print p pint * Employee. _doc_:, Employee. _doc_ Employee._name_: , Employee._name_ Employee._module_:Employee._module Employee_bases_:Employee._bases_ ppint Employee._diet_: , Employee _diet 执行以上代码输出结果如下: Employee
13、._doc_:所有员工的基类 Employee_name_: Employee Employee_module_: _main_ Employee_bases_:() Employee._diet_: _module_: _main_, displayCount: empCount: 0$ displayEmployee: _doc_,: xe6x89x80 xe6x9cx89xe5x91x98xe5xb7xa5xe7x9ax84xe5x9fxbaxe7xblxbb, _init_: python对象销毁(垃圾回收) 同Java语言一样,Python使用了弓I用计数这一简单技术来追踪内存中的对
14、象。 在Python内部i5录養所有使用中的嫌各有多少引用。 f内部跟踪变量,称为一个引用计数器。 当对象彼创建时.就创建了一个引用计数,当这个对象不再需要时,也就是说,这个又援的引用计数变为0 时,它被垃圾回收。但是回收不是立即啲,由解釋器在适当的时机,将垃圾对象占用的内存空间回收。 a = 40 #创建对象40 b = a #增加引用,40的计数 c = b #增加引用.40的计数 del a #减少引用40的计数 b = 100 #减少引用40的讣数 c0 = -1 #减少引用40的计数 垃圾回收机制不仅针对引用计数为0的又嫌,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互
15、引用,但是没有其他变量引用他们。这种情况下,仅使用弓I用计数是不够的。Pytho n的垃圾收集器实际上是一 个弓I用计数器和_个循环垃圾收集器。作为引用计数的补充,垃圾收集器也会留,海分配的总畳很大(及未通过 引用计数销毁的另陛)的51嫌。在这种情况下,解释器会暂停下来,试图淸理所有未弓I用的循环。 实例 析构函数_del_ ,逝的时候被调用,当又撅不再被使用时,_del_法运行: #coding=utf-8 #!/usr/bin/python selfx=0 y=0): X class Point: def _init( self.X = self.y = def _del_(self):
16、class_name = self._class_._name ppint class_namj destroyed ptl = pt2 = pt3 = print PointO ptl ptl id(ptl), id(pt2) id(pt3) # 打印对象的 id del ptl del pt2 del pt3 以上实例运行结果如下: 3083401324 3083401324 3083401324 Point destroyed 注意:通常你需要在单独的文件中走义f类, 类的继承 面向对象的编程带来的主要好处之一是代码的用,实现这种复用的方法之一是通过继承柄制。继承完全可以理 解成类之间的
17、类型和子类型关系。 需要注意的地方:继承语法class派生类名(基类名):/基类名写僧舌号里,基本类是在类定义的时候,在 元组之中指明的。 在python中继承中的一些特点: 1 :在继承中基类的构造(_init_()方法)不会被自动调用,它需要在其派咎的构造中亲自专门调用。 2 :在调用基类的方法时需要加上基类的类名前缀,且需要带上self参数变墨。区别于在类中调用普通函数时并 不需要带上self参数 3 : Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查 找。(先在本类中查找调用的方法找不到才去基类中找) 如果在继承元组中列了一个以上的类
18、,另吆它就被称作多置继承。 语法: 派生类的声明,与他们的父类类似继承的基类列表跟在类名之后,如下所示: class SubClassName (PanentClassl, ParentClass2 .): Optional class documentation string class suite 实例: #coding=utf-8 #!/usr/bin/python class Parent:# 泄义父类 parentAttr = 100 def _init_(self): print ”调用父类构造函数“ def parentMethod(self): print 调用父类方法 def
19、 setAttr(selfattn): Parent.panentAttr = attn def getAttr(self): print 父类属性:,Parent parentAttr class Child(Parent): # 宦义子类 def _init_(self): print ”调用子类构造方法“ def childMethod(self): C = ChildO c.childMethodO cparentMethod() csetAttp(200) c.getAttrO print,调用子类方法child method #实例化子类 #调用子类的方法 #调用父类方法 #再次调
20、用父类的方法 #再次调用父类的方法 以上代码执行结果如下: 调用子类构造方法 调用子类方法child method 调用父类方法 父类属性:200 你可以继承多个类 class A: #定义类A class B: #定义类8 class C(A, 8): #继承类A和B 你可以使用issubclassO或者isinstanceQ方法来检测。 issubclassO -布尔函数判断一个类是另f 类的務或者刊小类,语法:issubclass(subsup) isinstance(otClass)布尔函数如果obj是Class类的实例对象或者是一卜Class子类的实例又蟻则返回true. 方法重写
21、如果你的父类方法的功能不能满足你的壽求,你可以在子类重写你父类的方法: 实例: #coding=utf8 #!/usr/bin/python class Parent:# 泄义父类 def myMethod(self): print 调用父类方法 class Child(Parent): # 泄义子类 def myMethod(self): print 调用子类方法 C = ChildO C.myMethod() #子类实例 #子类调用重写方法 执行以上代码输出结果如下: 调用子类方法 基础重载方法 F表列出了一些通用的功能,你可以在自己的类豪写: 序号 方法,描述&简单的调用 _init_
22、( self args) 构造函数 简单的调用方法:obj = classNamc (args) _del_( self ) 析构方法,删除一个对象 简单的调用方法:dell obj _repr_( self ) 转化为供解释器读取的形式 简单的调用方法:repr(obj) _str_( self ) 用于将值转化为适于人阅读的形式 简单的调用方法:str(obj) _emp_ ( self, X ) 对象比较 简单的调用方法:emp (obj, X) 运算符重载 Python同样支持运算符靈载,实例如下: #!/usr/bin/python class Vector: def _init_(
23、selfb): self.a = a self.b = b def _str_(self): return Vector (%d %d) % (self.a, self.b) def _add_(selfothen): return Vector(self.a + other.a, self.b + other.b) vl = Vecton(2,10) v2 = Vecton(5,-2) ppint vl + v2 以上代码拥亍结果如下际 Vector(78) 类属性与方法 类的私有属性 _private_attrs :两个下划线开头,声明该厲性为私有,不能在类地外部被使用或亘接访问。在类内部的方法中 使用时 slf._private_attrSo 类的方法 在类地内部,使用def关键宇可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一 个参数 类的私有方法 _private_method :两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调 用 self._privatcjnethods 实例
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中职审计实训(审计实训基础)试题及答案
- 2025年大学林业工程(林业工程设计)试题及答案
- 2025年高职(出版商务)图书发行试题及答案
- 2025年高职智能工程机械运用技术(机械操作规范)试题及答案
- 2025年中职机电一体化技术(设备趋势分析)试题及答案
- 2026年中职第二学年(眼视光技术)验光配镜阶段测试题及答案
- 2025年中职食品包装(食品包装技术)试题及答案
- 2025年本科卫生信息管理(卫生信息系统)试题及答案
- 2025年大学食品安全与检测技术(农药残留检测)试题及答案
- 2025年大学教育学(教育政策学)试题及答案
- 飞机大战游戏设计与实现
- 数学课如何提高课堂教学容量
- 伤口造口院内专科护士护理考核试题与答案
- 监理规划毕业设计(论文)
- JJF 1759-2019衰减校准装置校准规范
- 群文阅读把数字写进诗
- 京港澳高速公路段改扩建工程施工保通方案(总方案)
- 医用设备EMC培训资料课件
- 2020年广东学位英语考试真题及答案
- 锅炉防磨防爆工作专项检查方案
- 气田后期开发技术负压采气技术
评论
0/150
提交评论