版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《Python语言程序设计》项目十类与对象高级应用Contents类方法和静态方法__slots__和@property装饰器元类的用法单例模式类方法PART01类方法是指使用@classmethod修饰的方法,其第一个参数是类本身(而不是类的实例对象)。类方法的特点是既可以通过类名直接调用,也可以通过类的实例对象调用。类方法类方法【任务描述】使用@classmethod修饰【关键步骤】使用@classmethod修饰示例011 classComplex:#定义Complex类2 def__init__(self,real=0,image=0):#定义构造方法3 self.real=real#初始化一个复数的实部值4 self.image=image#初始化一个复数的虚部值5 @classmethod6 defadd(cls,c1,c2):#定义类方法add,实现两个复数的加法运算7 print(cls)#输出cls8 c=Complex()#创建Complex类对象c9 c.real=c1.real+c2.real#实部相加10 c.image=c1.image+c2.image#虚部相加11 returnc12 if__name__=='__main__':13 c1=Complex(1,2.5)14 c2=Complex(2.2,3.1)15 c=Complex.add(c1,c2)#直接使用类名调用类方法add16 print('c1+c2的结果为%.2f+%.2fi'%(c.real,c.image))类方法使用示例:类方法示例01<class'__main__.Complex'>c1+c2的结果为3.20+5.60i程序执行完毕后,将在屏幕上输出如下结果:类方法示例01静态方法PART02静态方法是指使用@staticmethod修饰的方法。与类方法相同,静态方法既可以直接通过类名调用,也可以通过类的实例对象调用。与类方法不同的地方在于,静态方法中没有类方法中的第一个类参数。静态方法静态方法【任务描述】使用@staticmethod修饰【关键步骤】使用@staticmethod修饰示例021 classComplex:#定义Complex类2 def__init__(self,real=0,image=0):#定义构造方法3 self.real=real#初始化一个复数的实部值4 self.image=image#初始化一个复数的虚部值5 @staticmethod6 defadd(c1,c2):#定义类方法add,实现两个复数的加法运算7 c=Complex()#创建Complex类对象c8 c.real=c1.real+c2.real#实部相加9 c.image=c1.image+c2.image#虚部相加10 returnc11 if__name__=='__main__':12 c1=Complex(1,2.5)13 c2=Complex(2.2,3.1)14 c=Complex.add(c1,c2)#直接使用类名调用类方法add15 print('c1+c2的结果为%.2f+%.2fi'%(c.real,c.image))静态方法使用示例:静态方法示例02c1+c2的结果为3.20+5.60i程序执行完毕后,将在屏幕上输出如下结果:静态方法示例02动态扩展类与实例PART03Python作为一种动态语言,除了可以在定义类时定义属性和方法外,还可以动态地为已经创建的对象绑定新的属性和方法。动态扩展类与实例动态扩展类与实例【任务描述】为对象动态绑定对象和方法【关键步骤】为对象动态绑定对象和方法示例031 fromtypesimportMethodType#从types模块中导入MethodType方法2 classStudent:#定义学生类3 pass4 defSetName(self,name):#定义SetName函数5 =name6 defSetSno(self,sno):#定义SetSno函数7 self.sno=sno8 if__name__=='__main__':9 stu1=Student()#定义Student类对象stu110 stu2=Student()#定义Student类对象stu211 stu1.SetName=MethodType(SetName,stu1)#为stu1对象绑定SetName方法12 Student.SetSno=SetSno#为Student类绑定SetSno方法13 stu1.SetName('李晓明')14 stu1.SetSno('1810100')15 #stu2.SetName('张刚')16 stu2.SetSno('1810101')绑定新方法示例:动态扩展类与实例示例03__slots__PART04__slots__【任务描述】了解__slots__的用法【关键步骤】了解__slots__的用法示例041 classPerson:#定义Person类2 __slots__=('name')#定义允许动态扩展的属性3 classStudent(Person):#以Person类作为父类定义子类Student类4 __slots__=('sno')#定义允许动态扩展的属性5 classPostgraduate(Student):#以Student类作为父类定义子类Postgraduate类6 pass7 if__name__=='__main__':8 stu=Student()#定义Student类对象stu9 stu.sno='1810100'#为stu对象动态扩展属性sno10 ='李晓明'#为stu对象动态扩展属性name11 #stu.tutor='马红'#取消前面的注释符则会报错12 pg=Postgraduate()#定义Postgraduate类对象pg13 pg.sno='1810101'#为pg对象动态扩展属性sno14 ='张刚'#为pg对象动态扩展属性name15 pg.tutor='马红'#为pg对象动态扩展属性tutor__slots__变量以限制可动态扩展的属性。例如,如果我们希望Student类中只能动态扩展sno和name属性:__slots__示例04@propertyPART05@property装饰器,可以将类中属性的访问和赋值操作自动转为方法调用,这样可以在方法中对属性值的取值范围做一些条件限定。@property@property【任务描述】了解@property的用法【关键步骤】了解@property的用法示例051 importdatetime2 classStudent:#定义Student类3 @property4 defscore(self):#用@property装饰器定义一个用于获取score值的方法5 returnself._score6 @score.setter7 defscore(self,score):#用score.setter定义一个用于设置score值的方法8 ifscore<0orscore>100:#不符合0~100的限定条件9 print('成绩必须在0~100之间!')10 else:11 self._score=score12 @property13 defage(self):#用@property装饰器定义一个用于获取age值的方法14 returndatetime.datetime.now().year-self.birthyear15 if__name__=='__main__':16 stu=Student()#创建Student类对象stu17 stu.score=80#将stu对象的score属性赋值为8018 stu.birthyear=2000#将stu对象的birthyear属性赋值为200019 print('年龄:%d,成绩:%d'%(stu.age,stu.score))20 #stu.age=19#取消前面的注释符则会报错21 stu.score=105#将stu对象的score属性赋值为10522 print('年龄:%d,成绩:%d'%(stu.age,stu.score))@property示例05年龄:18,成绩:80成绩必须在0~100之间!年龄:18,成绩:80程序执行完毕后,将在屏幕上输出如下结果:@property示例05元类(metaclass)PART06元类(metaclass)【任务描述】了解元类(metaclass)的用法【关键步骤】了解元类(metaclass)的用法示例061 classStudent:#定义Student类2 pass3 stu=Student()#定义Student类的对象stu4 print('stu所属的类是:',stu.__class__)#使用__class__属性获取所属的类5 print('Student所属的类是:',Student.__class__)元类(metaclass)可以看成是创建类时所使用的模板,也可以理解为是用于创建类的类。stu所属的类是:<class'__main__.Student'>Student所属的类是:<class'type'>程序执行完毕后,将在屏幕上输出如下结果:元类(metaclass)示例06单例模式PART07单例模式(SingletonPattern)是指在程序运行时确保某个类最多只有一个实例对象。例如A类采用单例模式,则当创建A类对象时需要判断是否已存在A类对象:如果不存在,则创建一个A类对象;如果已存在,则直接使用已有的A类对象。当一个类对象用于存储程序中多个线程的共享信息时,就要求该类对象只有一份,以避免空间浪费以及信息不一致等问题。单例模式在介绍单例模式的具体实现方式前,先介绍使用类创建对象时的执行过程:当使用类创建一个对象时,使用__init__构造方法能够对对象中的属性做初始化操作。实际上,在执行__init__前,还会执行类的一个内置的类方法__new__,其作用是创建对象并返回;而之后执行的__init__则负责对__new__返回的对象做初始化。单例模式对象名(实参表)#等价于对象名.__call__(实参表)__call__是类的另一个内置方法,通过在一个类中定义__call__方法,可以支持如下写法:如果在元类中定义__call__方法,则可以改变类的实例化过程。单例模式有多种实现方式,这里介绍一种通过重写元类的__init__和__call__实现单例模式的方法。单例模式单例模式【任务描述】了解单例模式的用法【关键步骤】了解单例模式的用法示例071 classMyMetaclass(type):#以type作为父类创建子类MyMetaclass2 def__new__(cls,*args,**kwargs):3 print('MyMetaclass中的__new__被执行!')4 returnsuper().__new__(cls,*args,**kwargs)5 def__init__(self,*args,**kwargs):#定义__init__方法6 print('MyMetaclass中的__init__被执行!')7 self._instance=None8 returnsuper().__init__(*args,**kwargs)9 def__call__(self,*args,**kwargs):10 print('MyMetaclass中的__call__被执行!')11 ifself._instanceisNone:12 self._instance=super().__call__(*args,**kwargs)13 returnself._instance14 classWebData(metaclass=MyMetaclass):#MyMetaclass作元类定义WebData类15 def__new__(cls,*args,**kwargs):16 print('WebData类中的__new__被执行!')17 returnsuper().__new__(cls)18 def__init__(self):19 print('WebData类中的__init__被执行!')20 def__call__(self,timeout):21 print('WebData类中的__call__被执行!')22 self.timeout=timeout单例模式示例0723 if__name__=='__main__':24 wb1=WebData()#定义WebData类对象wb125 wb2=WebData()#定义WebData类对象wb226 wb1(60)#等价于wb1.__call__(60)27 print(wb1.timeout)28 wb1.timeout=3029 print(wb1.timeout)30 wb2.timeout=1531 print(wb1.timeout,wb2.timeout)单例模式MyMetaclass中的__new__被执行!MyMetaclass中的__init__被执行!MyMetaclass中的__call__被执行!WebData类中的__new__被执行!WebData类中的__init__被执行!MyMetaclass中的__call__被执行!WebData类中的__call__被执行!60301515程序执行完毕后,将在屏幕上输出如下结果:示例07鸭子类型PART08鸭子类型(DuckTyping)的含义是“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子”。在鸭子类型中,关注的不是对象所属的类,而是一个对象能够如何使用。在Python中编写一个函数,传递实参前其参数的类型并不确定,在函数中使用形参进行操作时只要传入的对象能够支持该操作程序就能正常执行。鸭子类型鸭子类型【任务描述】了解鸭子类型的用法【关键步骤】了解鸭子类型的用法示例081 classPerson:#定义Person类2 defCaptureImage(self):#定义CaptureImage方法3 print('Person类中的CaptureImage方法被调用!')4 classCamera:#定义Camera类5 defCaptureImage(self):#定义CaptureImage方法6 print('Camera类中的CaptureImage方法被调用!')7 defCaptureImageTest(arg):#定义CaptureImageTest方法8 arg.CaptureImage()#通过arg调用CaptureImage方法9 if__name__=='__main__':10 p=Person()#定义Person类对象p11 c=Camera()#定义Ca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年福建省福安三中招聘6人考前冲刺密卷附参考答案详解(达标题)
- 2026山西大同师范高等专科学校招聘博士研究生5人笔试题库及答案详解(名校卷)
- 交通事故民事起诉状范本+填写版
- 2026-2031年中国蜂产品行业市场深度分析及投资机会研究报告
- 浦东二模试题及答案
- 2025-2026学年四川省绵阳市三台县数学三年级第二学期期中质量跟踪监视试题含答案解析
- 专业消杀专项试题及完整答案
- 术前皮肤护理测试题及答案
- 2025-2026学年响水县三年级数学第二学期期中学业水平测试试题含解析
- 2026中国食品饮料出口行业市场竞争分析及商业投资预测规划研究报告
- 躯体忧虑障碍课件
- 危险化学品氧化工艺课件
- 2025年镇江护士考试题库答案
- 高校辅导员培训课件
- GB/T 9065.2-2025液压传动连接软管接头第2部分:24°锥形
- DB65T 8020-2024 房屋建筑与市政基础设施工程施工现场从业人员配备标准
- 鲁班奖工程质量创优策划
- 《Python程序设计》高职完整全套教学课件
- 河南科技大学《护理学基础》2021-2022学年第一学期期末试卷
- SHT 3554-2013 石油化工钢制管道焊接热处理规范
- 广东省寄生虫病防治技能竞赛理论考试题库(含答案)
评论
0/150
提交评论