Python 反射

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.
"""

判断一个对象中是否存在该属性

  • 返回值为 bool 类型
# 判断 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 属性
posted @ 2021-11-30 10:09  隔江千万里  阅读(53)  评论(0)    收藏  举报