Python中的反射介绍

2023-09-01 08:33:07 浏览数 (1)

反射是指在程序运行时,可以动态地获取对象的类型信息、属性和方法等信息,并可以对这些信息进行操作的一种机制。在Python中,反射是通过一组内置的函数和语句来实现的。你可以使用以下四个内置函数来实现Python中的反射:getattr、setattr、hasattr和delattr。

  • getattr(object, name[, default]):返回对象指定名称的属性值。如果属性不存在,则返回default值(如果提供了)。
  • setattr(object, name, value):将对象指定名称的属性设置为value。
  • hasattr(object, name):如果对象具有名称为name的属性或方法,则返回True。
  • delattr(object, name):从对象中删除名称为name的属性或方法。

下面简单看一下这几个函数的一些用法:

代码语言:javascript复制
import types


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

    def say_hi(self):
        print("Hello! My name is", self.name)


# 创建一个Person对象
p1 = Person("小博", 18)

# 使用getattr获取属性值
print(getattr(p1, "name"))  # 输出:小博
print(getattr(p1, "age"))  # 输出:18

# 使用setattr设置属性值
setattr(p1, "name", "小博测试成长之路")
print(p1.name)  # 输出:小博测试成长之路

# 使用hasattr检查属性是否存在
print(hasattr(p1, "age"))  # 输出:True
print(hasattr(p1, "sex"))  # 输出:False

# 使用delattr删除属性
delattr(p1, "age")
print(hasattr(p1, "age"))  # 输出:False


# 利用反射添加一个函数
def say_welcome(self):
    print("谢谢关注! My name is", self.name)


setattr(p1, "say_welcome1", say_welcome)
p1.say_welcome1(p1)  # 输出:谢谢关注! My name is 小博测试成长之路

# 将函数绑定到实例,确保正确地传递self参数
p1.say_welcome2 = types.MethodType(say_welcome, p1)
p1.say_welcome2()   # 输出:谢谢关注! My name is 小博测试成长之路

注意:types.MethodType() 是 Python 标准库 types 模块中的一个函数,用于将函数绑定到一个特定的对象上,从而创建一个方法。绑定后的方法会自动将对象本身作为第一个参数(通常命名为 self)传递给函数。

0 人点赞