Python面向对象之反射

发布时间 2024-01-12 21:34:27作者: 蓝幻ﹺ

【一】反射

【1】什么是反射

  • 反射是一种程序可以访问、检测和修改其本身状态或行为的能力。
  • 在 Python 中,反射主要指通过字符串的形式操作对象的属性。

【2】Python中的反射

  • 通过字符串的形式操作对象相关的属性。
  • python中的一切事物都是对象(都可以使用反射)

【二】反射方法

反射方法介绍

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def run(self):
        print("跑步")


person = Person('tom', 18)

hasattr(object, name)

  • 判断对象是否具有指定属性
# 获取到对象中的指定属性,如果存在,就返回 True
print(hasattr(person, 'name'))  # True
print(hasattr(person, 'run'))  # True

# 获取到对象中的指定属性,如果不存在,就返回 False
print(hasattr(person, 'sex'))  # False

getattr(object, name[, default])

  • 获取对象的属性值,如果属性不存在,可提供默认值。
# 获取到对象中的值,如果存在则返回当前值
print(getattr(person,'name'))
# 获取对象中的值,如果不存在则报错
print(getattr(person,'sex'))
# 获取对象中的值,如果不存在则报错,但是可以指定不存在的时候返回的默认值
print(getattr(person,'sex',None))
# 如果获取的是对象中的函数,那会直接返回函数的内存地址,可以直接调用该函数
res = getattr(person,'run')

setattr(object, name, value)

  • 设置对象的属性值
def eat():
    print("吃饭")

# 设置方法
setattr(person, 'eat', eat)
# 获取方法
print(getattr(person, 'eat'))  # <function eat at 0x0000028550C57DC0>
# 使用方法
person.eat()  # 吃饭

delattr(object, name)

class Person:
    name='as'
    def __init__(self, age):
        self.age = age

    def run(self):
        print("跑步")
        
per = Person('tom') 
  • 如果是类,可以删除自己的数据属性和函数属性
delattr(Person, 'name')
delattr(Person, 'run')
  • 如果是对象,只能删除自己的 数据属性

  • 删除类中的数据属性,不能删除对象中的父类中的数据属性

delattr(per, 'name') # 报错
delattr(per, 'age')
delattr(per, 'run') # 报错