当前位置: 首页 > 科技观察

Python内置方法和属性在Python中的应用:反射和单例

时间:2023-03-12 06:04:25 科技观察

一、前言除了丰富的第三方库之外,python本身也提供了一些内部方法和一些底层属性,比如dict、list、set,min,max,range,sorted等。笔者最近在做项目框架的时候涉及到了一些不太常用的方法和属性,在本文中分享给大家。2.enumerate内置方法和函数介绍如果需要遍历一个可迭代对象,需要获取它的序号,可以使用enumerate,每个next返回一个tuplelist1=[1,2,3,4]list2=[4,3,2,1]foridx,valueinenumerate(list1):print(idx,value,list2[idx])#014#123#232#341zipzip从参数中的多个迭代器中获取元素并将它们组合成一个新的一个迭代器;#添加序列号到列表b=[4,3,2,1]foriinzip(range(len(b)),b):print(i)#(0,4)#(1,3)#(2,2)#(3,1)globals():描述当前执行进程中全局符号表的字典,可以看到你执行的所有进程id(object):python对象的唯一标识staticmethod类静态函数注解@staticmethoddeftest():print('thisisstaticmethod')Foo.test=testFoo.test()类的属性我们看下类的声明,如下:classFoo():"""thisistestclass"""def__init__(self,name):self.name=namedefrun(self):print('running')#列出类的所有成员和属性dir(Foo)['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','run']#类注解Foo.__doc__#'thisistestclass'#类自定义属性Foo.__dict__mappingproxy({'__module__':'__main__','__doc__':'thisistestclass','__init__':,'run':,'__dict__':,'__weakref__':})#Foo类的父类.__base__#类Foo的名称.__name__类的实例化和初始化#Python类首先被__new__实例化,然后调用__init__初始化类成员foo=Foo('milk')类属性的添加和访问#类访问foo.namefoo.run()#可以通过setattr动态添加属性defmethod():print("cow")setattr(foo,"type","cow")setattr(foo,"getcow",method)#cowfoo.typefoo.getcow()#动态删除属性delattrdelattr(foo,"type")#getattr获取成员属性ifhasattr(foo,"run"):#判断是否有attributefunc=getattr(foo,"run")func()3.应用单例模式简介单例模式(SingletonPattern)是Java中最简单的设计模式之一。实例只实例化一次,所有对象共享一个实例。创建的方法是在实例化的时候判断是否已经实例化,如果是则返回实例化的全局实例。python是怎么实现的呢?关键是找到实例化的地方,没错,就是__new__classSingleton(object):def__new__(cls,*args,**kwargs):ifnothasattr(cls,'_instance'):cls._instance=object.__new__(cls)returncls._instancedef__init__(self,name):self.name=namea=Singleton('name1')b=Singleton('name2')print(id(a),id(b))print(a.name,b.name)#16893522131121689352213112#name2name24。反射应用反射在许多框架中使用,只需通过类的名称(字符串)实例化即可。一个典型的场景是通过配置来动态控制类的执行,比如定时任务的执行。通过维护每个调度任务类的执行时间,当执行时间到了,通过反射实例化该类,执行任务。在java中也很常见。python的实现可以通过上面提到的getattr获取模块中的类,通过methodcaller调用方法。让我们看一个简单的例子模块,默认__main__,可以通过Foo.__dict__中的'__module__'获取。')#Instantiationparams=["milk"]instance=clazz(*params)#方法调用,方法也是字符串methodcaller(方法名,方法参数)task_result=methodcaller("run","re??flection")(instance)#runningreflection5。通过分享python内置方法和属性,并在单例模式和反射中应用它们来结束这篇文章。希望对你有帮助,欢迎与@mintel交流主要总结如下:classunderdirviewclass自定义属性__dict____new__实例化类,__init__初始化类getattrgetattributesetattrsetattribute记住importlib和methodcaller