欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#python中的反射方法,getattr,setattr,hasattr,delattr

程序员文章站 2022-07-15 16:50:20
...

#python中的反射方法,getattr,setattr,hasattr,delattr
data:2019/12/4

python 面向对象中的反射:
通过字符串的形式操作对象相关的属性 python 中的一切事物都是对象(都可以使用反射)
四个反射相关的函数
hasattr :判断是否有此变量,返回 bool 值
getattr : 获取属性值或者获取方法变量的地址
setattr :给类或者对象设置属性或者方法 (用的场合很少,了解即可)
delattr: 删除类或者对象的属性或方法(用的场合很少,了解即可)
它们能够反射类的属性和方法 , 反射对象的属性和方法 以及反射模块的属性和方法

class Test(object):
    dict1 = {
        'baby':'me',
        'happy':106,
        'hello':'world'
    }

    def __init__(self,num):
        self.num = num

    def func1(self):
        return 666

    @classmethod
    def func2(cls):
        return 888

#反射类的属性和方法

print(hasattr(Test,'dict1'))  #判断类中是否有dict1这个类属性
print(getattr(Test,'dict1')) #获取这个类属性的值
print(setattr(Test,'name','jingugu')) #为这个类设置一个name的类属性
print(Test.dict1) #调用类属性
print(Test.name) #调用类属性
print(delattr(Test,'name')) #删除name类属性
print(getattr(Test,'func1')) #调用成员方法地址,但是并不能加()调用,因为这个方法需要类的对象才能调用
t = Test(1)
print(getattr(Test,'func1')(t)) #但是这样也可以调用哒哒哒
print(getattr(Test,'func2')())  #调用类方法
True
{'baby': 'me', 'happy': 106, 'hello': 'world'}
None
{'baby': 'me', 'happy': 106, 'hello': 'world'}
jingugu
None
<function Test.func1 at 0x000001CE65207288>
666
888

#反射对象的属性和方法

t = Test(1)
print(hasattr(t,'num'))
print(getattr(t,'num'))
print(setattr(t,'num',2))
print(t.num)
print(delattr(t,'num'))
try:
    print(t.num)
except:
    print('报错')
print(getattr(t,'func1')())
True
1
None
2
None
报错
666

相关标签: 学习笔记 python