python中的反射机制

Posted on 2022-05-16 21:49  foghorn  阅读(58)  评论(0编辑  收藏  举报

转自https://www.cnblogs.com/renjie1105/p/15909285.html

python反射简介

在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未知的方法或变量,这中机制就称之为反射。

hasattr

判断对象中是否有这个方法或变量

class Person:
    def __init__(self, name):
        self.name = name
    
    def talk(self):
        print(f'{self.name}正在交谈')


p = Person('alice')
print(hasattr(p, 'talk'))
print(hasattr(p, 'name'))
print(hasattr(p, 'abc'))

输出:

True
True
False

getattr

获取对象中的方法或变量的内存地址

class Person:
    def __init__(self, name):
        self.name = name
    
    def talk(self):
        print(f'{self.name}正在交谈')


p = Person('alice')
n = getattr(p, 'name')  # 获取name变量的内存地址
print(n)
f = getattr(p, 'talk')  # 获取talk方法的内存地址
f()
s = getattr(p, 'abc', 'not find')  # 打印结果:not find。
                                   # 因为abc在对象p中找不到,本应该报错,
                                   # 属性找不到,但因为修改了找不到就输出not find
print(s)

setattr

为对象添加变量或方法

def abc(self):
    print(f'{self.name}正在交谈')


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


p = Person('alice')
setattr(p, 'talk', abc)  # 将abc函数添加到对象p中,并命名为talk
p.talk(p)  # 调用talk方法,因为这是额外添加的方法,需手动传入对象
setattr(p, 'age', 30)  # 添加一个变量age,初始值为30
print(p.age)

delattr

删除对象中的变量,但是不能删除方法

Copyright © 2024 foghorn
Powered by .NET 9.0 on Kubernetes