反射

反射

  • 在 Python 中,反射是指在运行时获取对象的信息,包括对象的属性和方法,以及动态地操作这些属性和方法。在面向对象编程中,反射允许你在运行时检查类和对象的信息,而不是在编写代码时硬编码这些信息。

(1)获取对象属性值和方法/调用getattr()

  • 语法:getattr(object, name[, default])

  • 使用 getattr() 函数可以获取对象的属性值。

  • 不存在则报错,但是可以指定不存在的时候返回的默认值

class Heart:
def __init__(self):
self.age = 18
heart = Heart()
print(getattr(heart, 'age')) # 输出: 18
print(getattr(heart, 'name', None)) # 输出: None
  • 使用 getattr() 函数可以获取对象的方法。
class Heart:
def talk(self):
return f'说话'
heart = Heart()
method = getattr(heart, 'talk')
result = method()
print(result) # 输出: 说话
  • 使用 getattr() 函数获取方法,然后直接调用。
class Heart:
def talk(self):
return "说话"
heart = Heart()
method = getattr(heart, 'talk')
result = method()
print(result) # 输出: 说话

(2)设置对象的属性setattr()

  • 语法:setattr(object, name, value)

  • 使用 setattr() 函数可以设置对象的属性值。

class Heart:
def __init__(self):
self.age = 18
heart = Heart()
setattr(heart, 'age', 100)
print(heart.age) # 输出: 100

(3)检查对象是否有某个属性或方法hasattr()

  • 语法:hasattr(object, name)

  • 使用 hasattr() 函数可以检查对象是否具有指定的属性或方法。

  • 存在就返回True,不存在就返回False

class Heart:
def __init__(self):
self.age = 42
heart = Heart()
has = hasattr(heart, 'age')
print(has) # 输出: True
has1 = hasattr(heart, 'name')
print(has1) # 输出: False

(4)删除对象属性delattr()

  • 语法:delattr(object, name)

  • 使用 delattr() 函数可以删除对象属性的内建函数。

class Heart:
def __init__(self):
self.age = 18
heart = Heart()
print(hasattr(heart, 'age')) # True
delattr(heart, 'age')
print(hasattr(heart, 'age')) # False

小练习

class Heart:
def __init__(self):
self.age = 18
heart = Heart()
def func(obj=None, name=None, value=None):
if hasattr(obj, name):
return getattr(obj, name)
else:
setattr(obj, name, value)
print(f'设置成功')
return func(obj=obj, name=name, value=value)
print(func(obj=heart, name='age')) # 18
print(func(obj=heart, name='name', value='heart')) # 设置成功 heart
def read():
print(f'正在读书')
func(obj=heart, name='read', value=read)() # 设置成功 正在读书
posted @   ssrheart  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示