python:反射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python:反射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2435字,纯文字阅读大概需要4分钟。
内容图文
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四种形式:getattr setattr delattr hasattr
getattr(obj,name)
例:反射类
# 反射对象的属性 # 反射对象的方法 # 反射类的属性 # 反射类的方法:classmethod staticmethod class Person: __mongy = 1000 nationality = ‘china‘def__init__(self,name,sex,height): self.name = name self.sex =sex self.__height = height @property def height(self): return self.__height @classmethod def money(cls): cls.__mongy = 0 return‘run out of money,%s‘%cls.__mongy aike = Person(‘aike‘,‘man‘,‘180‘) print(getattr(aike,‘name‘))#反射对象的属性print(getattr(aike,‘height‘))#反射对象的方法print(getattr(aike,‘money‘)())#反射对象的方法print(getattr(Person,‘money‘)())#反射类的方法print(getattr(Person,‘nationality‘))#反射类的属性#打印:aike 180 run out of money,0 run out of money,0 china
例:反射模块
假设有模块func,在源码下进行反射
def login(): #函数print(‘登录成功‘) a = 100 #属性class Teacher: #类 school = ‘清华‘# @classmethod #实现类对象def info_func(cls): #对象的方法print(‘这是类中的动态属性‘) import sys # getattr(sys.modules[‘__main__‘],‘login‘)() #在该模块的源文件下进行反射,获取对象的方式需要用法sys模块获取 getattr(sys.modules[__name__],‘login‘)() #若需要在调用该模块的对象下执行该反射,需要把‘__main__‘换成__name__,# 原理是当我们直接执行这个模块的时候,__name__ == ‘__main__‘,# 当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == ‘模块的名字‘if__name__ == ‘__main__‘: print(sys.modules)
func模块被调用:
# 反射模块的属性 # 可以反射内置模块 # 反射模块的方法 # 假设模块为文件夹下的func import func # func.login()#调用模块中的函数 getattr(func,‘login‘)()#反射模块中的函数 # print(func.a)#调用模块中的属性print(getattr(func,‘a‘))#反射模块中的属性print(getattr(func.Teacher,‘school‘))#反射模块中的类的属性 aike = getattr(func,‘Teacher‘)() #反射得到类Teacher,加()则创建一个对象 getattr(func.Teacher,‘info_func‘)(aike)#要反射的函数有参数怎么办?传入一个符合条件的参数即可
hasattr:判断该对象是否有某个属性或者方法,返回Ture或False,一般和getattr配合使用
# 继续以模块func为例 import func print(hasattr(func,‘login‘)) if hasattr(func,‘login‘): #如果func有longin属性,则反射 getattr(func,‘login‘)() #打印:True 登录成功
setattr:设置属性
# setattr(x, ‘y‘, v)——>`x.y = v‘ class A: pass a = A() setattr(a,‘name‘,‘艾克‘)#对象的属性 setattr(A,‘name‘,‘aike‘)#类的静态属性print(A.name)#aikeprint(a.name)#艾克
delattr:删除属性
class A: pass a = A() setattr(a,‘name‘,‘艾克‘)#对象的属性 setattr(A,‘name‘,‘aike‘)#类的静态属性print(A.name)#aikeprint(a.name)#艾克 delattr(A,‘name‘) print(a.name)#艾克 delattr(a,‘name‘) print(a.name)#报错
注意:python中的一切事物都是对象,是对象都可以使用到反射,在一个模块源码下反射模块中的属性,获取对象名的方式需要用到sys模块的modules方法:sys.modules[‘__main__‘]
若需要在调用该模块的对象下执行该反射,需要把‘__main__‘换成__name__
原理是当我们直接执行这个模块的时候,__name__返回值为‘__main__‘,当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__返回值为‘被调用的模块名字‘
原文:https://www.cnblogs.com/aizhinong/p/11482145.html
内容总结
以上是互联网集市为您收集整理的python:反射全部内容,希望文章能够帮你解决python:反射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。