首页 > 编程语言 > 详细

python:反射

时间:2019-09-07 19:00:06      阅读:73      评论:0      收藏:0      [点我收藏+]
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)#aike
print(a.name)#艾克

 

delattr:删除属性
class A:
    pass
a = A()
setattr(a,name,艾克)#对象的属性
setattr(A,name,aike)#类的静态属性
print(A.name)#aike
print(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__返回值为‘被调用的模块名字‘

python:反射

原文:https://www.cnblogs.com/aizhinong/p/11482145.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!