目录
通常,我们操作对象的属性或者方法时,是通过点 “.” 操作符进行的。例如下面的代码:
前言:
Python 是一种广泛使用的编程语言,它可以用于开发各种软件和应用程序。Python 反射机制是 Python 中的一个重要概念,它可以帮助我们更轻松地访问和修改类、方法和属性。
通常,我们操作对象的属性或者方法时,是通过点 “.” 操作符进行的。例如下面的代码:
class Person:
type = "mammal"
def __init__(self, name):
self.name = name
def say_hi(self):
print('Hello, my name is', self.name)
@staticmethod
def feed():
print("Three times per day.")
@classmethod
def sleep(cls):
print("8 hours!")
p = Person('Chunming')
p.say_hi()
print(p.name)
上面代码的输出是:
Hello, my name is Nikhil
Nikhil
反射是另外一种操作对象属性和方法的手段,例如:
func = getattr(p, 'say_hi')
func()
print(getattr(p, "name"))
上面这段代码的输出是:
Hello, my name is Nikhil
Nikhil
可见与通过点操作符的结果一致。
1. 反射的四个函数
getattr 是获取对象属性或方法的函数,Python 的官方文档是这样描述其用法的:
getattr(object, name, value)
返回对象命名属性的值。name 必须是字符串。如果该字符串是对象的属性之一,则返回该属性的值。例如, getattr(x, 'foobar') 等同于 x.foobar。如果指定的属性不存在,且提供了 default 值,则返回它,否则触发 AttributeError。
根据文档理解上述代码,getattr(p, 'say_hi') 获取了 p 对象的 say_hi 属性值并赋值给 func 变量,因为 say_hi 属性在 Person 类中是一个方法,要想调用这个方法, 需要执行 func(),getattr(p, "name") 则是获取 p 对象的 name 属性。
除了获取对象属性和方法的 getattr 函数,python 还内置了判断、设置、删除对象属性和方法的函数,来看看 Python 官方文档对这三个函数的说明:
setattr(object, name, value)
此函数与 getattr() 两相对应。其参数为一个对象、一个字符串和一个任意值。字符串指定一个现有属性或者新增属性。函数会将值赋给该属性,只要对象允许这种操作。例如,setattr(x, 'foobar', 123) 等价于 x.foobar = 123。
hasattr(object, name)
该实参是一个对象和一个字符串。如果字符串是对象的属性之一的名称,则返回 True,否则返回 False。(此功能是通过调用 getattr(object, name) 看是否有 AttributeError 异常来实现的。)
delattr(object, name)
setattr() 相关的函数。实参是一个对象和一个字符串。该字符串必须是对象的某个属性。如果对象允许,该函数将删除指定的属性。例如 delattr(x, 'foobar') 等价于 del x.foobar 。
Python 中通过 getattr、setattr、hasattr 和 delattr 四个函数操作属性的机制就是反射。是通过字符串的形式操作对象属性和方法的机制。下面对 p 属性应用 setattr、hasattr 和 delattr 这三个函数看看效果:
判断 p 对象是否有 say_bye 属性和 say_hi 属性:
print(hasattr(p, 'say_bye')) # 输出 False
print(hasattr(