◎知识点
反射概念与使用示例
◎脚本练习
"""反射"""
"""
所谓"反射",指的是以字符串的形式来操作(包括:增删改查)对象的属性和方法
用于"反射"的内置函数有以下四个(参数name都是一个字符串)
1. hasattr(object, name)
用于判断指定的对象object是否有参数name指定的属性和方法
2. getattr(object, name[, default])
用于获取指定的对象object中名为name指定的属性或方法
如果不指定参数default,那么当object中不存在名为name的属性或方法时,抛出AttributeError
如果指定了参数default,那么当object中不存在名为name的属性或方法时,就会返回default
getattr(object, name)等价于:object.name
3. setattr(object, name, value)
用于在指定的对象object中添加或修改名为参数name的属性或方法,添加或修改后的值为value
setattr(object, name, value)等价于:object.name = value
4. delattr(object, name)
用于删除指定的对象object中名为参数name的属性或方法
delattr(object, name)等价于:del object.name
注意:只有在不知道对象信息的情况下,才会去获取对象的信息。因此,如果可以直接写:object.name,
就不要写getattr(object, 'name')
"""
class MyClass(object):
def __init__(self):
self.x = 1
def do_sth(self):
print("do_sth被调用")
mc = MyClass()
print(hasattr(mc, 'x')) # True
print(hasattr(mc, 'do_sth')) # True
print(hasattr(mc, 'y')) # False
print(getattr(mc, 'x')) # 1
f = getattr(mc, 'do_sth')
f() # do_sth被调用
# print(getattr(mc, 'y')) # AttributeError: 'MyClass' object has no attribute 'y'
print(getattr(mc, 'y', 2)) # 2
setattr(mc, 'z', 3)
print(getattr(mc, 'z')) # 3
setattr(mc, 'z', 4)
print(getattr(mc, 'z')) # 4
delattr(mc, 'z')
print(hasattr(mc, 'z')) # False