Python中的单例模式与反射机制详解_第1页
Python中的单例模式与反射机制详解_第2页
Python中的单例模式与反射机制详解_第3页
Python中的单例模式与反射机制详解_第4页
全文预览已结束

下载本文档

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

文档简介

第Python中的单例模式与反射机制详解目录单例模式反射hasattergetattrsetattr总结

单例模式

一般情况下,类可以生成任意个实例,而单例模式只生成一个实例

我们先用单例模式设计一个Rectangle类

然后用__new__方法设计单例模式,代码如下

classRectangle:

def__init__(self,length,width):

self.length=length

self.width=width

def__new__(cls,*args,**kwargs):#__new__至少要有一个参数cls,代表要实例化的类

ifnothasattr(cls,'obj'):#判断类当中有没有实例,如果没有则新建

cls.obj=object.__new__(cls)#生成实例对象

returncls.obj

然后我们来验证下,单例模式下是否只能生成一个实例

rec1=Rectangle(10,8)#判断类中没有实例,则新建实例rec1

print(rec1.length,rec1.width)#这时候我们打印下rec1这个长方形的长和宽

108#是我们输入的值

rec2=Rectangle(6,4)

#Rectangle已经创建过rec1实例了,所以不会再生成新的实例,此时的rec1和rec2指向是同一个对象:Rectangle(6,4)

print(rec1.length,rec1.width)#打印下rec1的长和宽

print(rec2.length,rec2.width)#打印下rec2的长和宽

print(id(rec1)==id(rec2))

Ture#对象/实例只有一个,只是赋给了不同的变量名

单例模式在程序设计中比较典型的应用场景:多个用户同时调用某个模块时,会生成一些日志,我们希望这些日志存在同一个文件内,而不是多个文件。

在生成日志模块我们就可以采用单例模式进行设计。

反射

概念:简单来说就是可以利用字符串来映射模块中的相应方法然后可以操作模块中相应的方法

我们以一个饭店点菜的实际场景来理解Python的反射机制

classFood_list:#创建一个饭店菜单的类

defyxrs(self):

return'鱼香肉丝'

defgbjd(self):

return'宫保鸡丁'

defhspg(self):

return'红烧排骨'

hasatter

hasatter(对象,属性或方法名)

判断对象中是否有某个属性或某个方法,返回值是布尔型

guke1=Food_list()#实例化一个顾客对象

whileTrue:

diancai=input('请点菜:')

ifhasattr(guke1,diancai):#判断顾客点的菜有没有

print('好的,马上去做')

break

else:

print('这个没有,换个别的吧')

请点菜:佛跳墙

这个没有,换个别的吧

请点菜:yxrs

好的,马上去做

getattr

getattr(对象,属性或方法名,缺省值)判断对象中是否有某个属性或某个方法,如果有返回方法本身,没有则返回缺省值

guke1=Food_list()#实例化一个顾客对象

deffun1():#定义一个方法,用作getattr的缺省值

return'没有这道菜'

foodname=input('请输入要翻译的菜名:')

a=getattr(guke1,foodname,fun1)

#判断guke1中有没有foodname方法,有则返回这个方法,没有则返回fun1方法

print(a())#执行返回的方法

请输入要翻译的菜名:yxrs#guke1中有yxrs方法,则返回这个方法

鱼香肉丝

请输入要翻译的菜名:dsfsfs#guke1中有没有dsfsfs方法,则返回fun1方法

没有这道菜

setattr

setattr(对象,属性,新值)

将实例的属性改为新的值,如果属性不存在则新建

我们给实例guke1加个价格属性

guke1=Food_list()#实例化一

温馨提示

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

评论

0/150

提交评论