反射
反射,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
关于反射的方法有四个,getatter,hastter是一对,表示执行和检测
而setatter是一个关于设置修改的方法
delatter是关于删除的一个方法
getatter,hastter
class Fruit_price: conformation='shopping' def __init__(self,original_price,discount,name): self.__original_price=original_price self.__discount=discount self.__name=name @property def price(self): return self.__original_price*self.__discount def func(self): print('打折啦,现在%s,只要%s 元了'%(self.__name,self.price)) apple=Fruit_price(5,1,'苹果') print(apple.price) print(getattr(apple,'price',None))#可以只输入前面的两个值,第三个值是,前面不能只想,便会输出此值 #如果没有输入第三个值,便会报错 #print(getattr(apple,'pric','your input in error')) 报错 print(getattr(apple,'pric','your input in error')) get = getattr(apple,'func') get() print(hasattr(apple,'price')) print(Fruit_price.conformation) print(getattr(Fruit_price,'conformation')) if hasattr(apple,'func'): #一般 hasattr 与 getattr配合使用 get = getattr(apple,'func') get() '''输出结果5 5 your input in error 打折啦,现在苹果,只要5 元了 True shopping shopping 打折啦,现在苹果,只要5 元了 '''
getatter(),后面相当于类名.属性,把 . 改为,, 并且把属性变为字符串了,同理,对象名.属性也是如此。对象名.方法名 就变为了(对象名,‘方法’)得到是一个内存之地,返回值加上(),变
调用这个方法了。getattr有三个参数,最后一个是避免报错的,如果报错就输出最后一个参数
几乎所有 对象.方法(属性)都支持反射。说明其强大
hasattr 的返回值时bool值,一般与gerattr配合使用,一般作为条件,为getattr作为铺垫
反射模块的属性与方法
import time get=getattr(time,'sleep') get(3) print('延迟了3秒')
import sys
print(getattr(sys,'path'))
print(getattr(sys,'version'))
反射自己中的变量和模块
import sys def wahaha(): print('lalal') return 'i like drink wahahah' #调用方法一 getattr(sys.modules['__main__'],'wahaha')() #调用方法二 get = getattr(sys.modules['__main__'],'wahaha') get() #有时可能会被当做模块被导入,但是还是要执行自己的的函数。所以此时把'__main__'改为__name__, #在自己中,__name__输出__main__,被其他文件导入时,此时输出为__模块名__ get = getattr(sys.modules[__name__],'wahaha')
反射的方法有参数时
import time print(time.strftime('%Y-%m-%d %H:%M:S')) print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S')) get = getattr(time,'strftime') print(get('%Y-%M-%d:%H-%M'))
delattr与setattr
class Name: def __init__(self,name): self.name=name xiaoming=Name('xiaoming') setattr(xiaoming,'name',5)# 等价于xiaoming.name=5 #此时的要修改的参数,不一定为str print(xiaoming.name)
class Name: def __init__(self,name,age): self.name=name self.age=age xiaoming=Name('xiaoming',18) print(xiaoming.__dict__) print(xiaoming) delattr(xiaoming,'age') print(xiaoming.__dict__) print(xiaoming) '''输出结果{'age': 18, 'name': 'xiaoming'} <__main__.Name object at 0x0000000000A84668> {'name': 'xiaoming'} <__main__.Name object at 0x0000000000A84668> '''