Python 反射
定义一个测试类
class Student:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def get_name(self):
return self.name
def __setattr__(self, key, value):
# settattr(object, key, value) 触发此魔法函数
self.__dict__[key] = value
def __getattr__(self, item):
print('{}属性不存在, 属性不存在时触发此函数'.format(item))
return
student_obj = Student('student', 18, 'man')
hasattr(object, ’attr‘)
源码注释
# 源码中的注释说明
"""
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
"""
判断一个对象中是否存在该属性
# 判断 student_obj 对象中是否存在 name 属性
hasattr_name = hasattr(student_obj, 'name')
hasattr_get_name = hasattr(student_obj, 'get_name')
hasattr_set_name = hasattr(student_obj, 'set_name')
print(hasattr_name, type(hasattr_name)) # True <class 'bool'>
print(hasattr_get_name, type(hasattr_get_name)) # True <class 'bool'>
print(hasattr_set_name, type(hasattr_set_name)) # False <class 'bool'>
setattr(x, 'y', v)
源码中的注释说明
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to x.y = v''
"""
设置一个属性
- 在 student_obj 对象中新增加一个 k 属性,y 作为 k 的值。
# setattr 新增属性; k为属性名,y为属性值
setattr(student_obj, 'k', 'y')
get_x = getattr(student_obj, 'k')
print(get_x) # y
- 修改 student_obj 中的 name 属性值为 ’new_student‘
# setattr 修改属性; 如果一个属性存在,那么setattr会将他进行修改
# 将 student_obj 对象中的 'name' 变量, 修改为 new_student;
# name为属性名,new_student为属性值
setattr(student_obj, 'name', 'new_student')
get_name = getattr(student_obj, 'name')
print(get_name) # new_student
def func(self):
print(self.name)
print("新增一个函数")
setattr(student_obj, 'func', func)
# 使用这个成员函数
func = getattr(student_obj, 'func')(student_obj)
# 或者
# func = getattr(student_obj, 'func')
# func(student_obj)
getattr(item)
get_x = getattr(student_obj, 'x1')
print(get_x) # y
# 当查找的属性不存在时 触发 __getattr__() 函数
value = getattr(student_obj, 'x22222')
delattr(x, y)
# 源码中的注释说明
"""
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''"
"""
delattr(student_obj, 'func')
try:
getattr(student_obj, 'func')()
except AttributeError as e:
print("Student 类中没有 func 属性") # Student 类中没有 func 属性