反射

反射

  • 在 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 @ 2024-01-05 19:20  ALPACINO6  阅读(22)  评论(0)    收藏  举报