python面向对象之反射
一、静态方法(staticmethod)和类方法(classmethod)
类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)
静态方法:让类里的方法直接被类调用,就像正常调用函数一样
类方法和静态方法的相同点:都可以直接被类调用,不需要实例化
类方法和静态方法的不同点:
类方法必须有一个cls参数表示这个类,可以使用类属性
静态方法不需要参数
绑定方法:分为普通方法和类方法
普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定到对象
类方法:默认有一个cls对象传进来,并且可以被类和对象(不推荐)调用-----绑定到类
非绑定方法:静态方法:没有设置默认参数,并且可以被类和对象(不推荐)调用-----非绑定
importtimeclassDate:def__init__(self,year,month,day):self.year=yearself.month=monthself.day=day#@staticmethod#defnow():#t=time.localtime()#returnDate(t.tm_year,t.tm_mon,t.tm_mday)@classmethod#改成类方法defnow(cls):t=time.localtime()returncls(t.tm_year,t.tm_mon,t.tm_mday)#哪个类来调用,即用哪个类cls来实例化classEuroDate(Date):def__str__(self):return'year:%smonth:%sday:%s'%(self.year,self.month,self.day)e=EuroDate.now()print(e)#我们想触发EuroDate.__str__,此时e就是由EuroDate产生的,结果如我们所愿'''输出结果:year:2017month:3day:3'''
二、反射
反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射。
反射有四种方法:
hasattr:hasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False
getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr和getattr配套使用
需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()
setattr:给对象的属性赋值,若属性不存在,先创建后赋值
delattr:删除该对象指定的一个属性
1、对象应用反射
classFoo:def__init__(self):self.name='egon'self.age=51deffunc(self):print('hello')egg=Foo()print(hasattr(egg,'name'))#先判断name在egg里面存在不存在,结果是Trueprint(getattr(egg,'name'))#如果为True它才去得到,结果是egonprint(hasattr(egg,'func'))#结果是Trueprint(getattr(egg,'func'))#得到的是地址<boundmethodFoo.funcof<__main__.Fooobjectat0x0000000001DDA2E8>>getattr(egg,'func')()#在这里加括号才能得到,因为func是方法,结果是hello一般用法如下,先判断是否hasattr,然后取getattrifhasattr(egg,'func'):getattr(egg,'func')()#结果是helloelse:print('没找到')
2、类应用反射
classFoo:f=123@classmethoddefclass_method_dome(cls):print('class_method_dome')@staticmethoddefstatic_method_dome():print('static_method_dome')print(hasattr(Foo,'class_method_dome'))#结果是Truemethod=getattr(Foo,'class_method_dome')method()#结果是class_method_domeprint(hasattr(Foo,'static_method_dome'))#结果是Truemethod1=getattr(Foo,'static_method_dome')method1()#结果是static_method_dome
3、模块应用反射
# 1.导入其他模块引用
importmymoduleprint(hasattr(mymodule,'test'))getattr(mymodule,'test')()p=getattr(mymodule,'test')p()#相当于上面getattr(mymodule,'test')()
# 2.在本模块中应用反射
defdemo1():print('hello')importsysmodule_obj=sys.modules[__name__]#相当于'__main__'print(module_obj)#结果是<module'__main__'from'C:/Users/Administrator/Desktop/test.py'>print(hasattr(module_obj,'demo1'))#结果是Truegetattr(module_obj,'demo1')()#结果是hello
导入自己的模块的例子:
def注册():print('regiester')def登录():print('login')def购物():passprint('注册,登录,购物')ret=input('请输入你要做的操作:')importsysmy_module=sys.modules[__name__]#利用sys模块导入一个自己的模块ifhasattr(my_module,ret):getattr(my_module,ret)()
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。