反射

python

反射

  反射指的是通过 ”字符串“ 对对象的属性或方法进行操作。

  反射的方法有:

    hasattr:通过 ”字符串“ 判断对象的属性或方法是否存在

    getattr:通过 ”字符串“ 获取对象的属性值或方法

    setattr:通过 ”字符串“ 设置对象的属性值

    delattr:通过 ”字符串“ 删除对象的属性或方法

  注意:反射的四个方法都是python内置

1、hasattr

  通过 ”字符串“ 判断对象的属性或方法是否存在

class Foo:

def__init__(self, x, y, z):

self.x = x

self.y = y

self.z = z

def func(self):

pass

foo_obj = Foo(10, 20, 30)


# hasattr:通过字符串 "x"、"y"、"z" 判断对象中是否存在属性

print(hasattr(foo_obj, "x"))

print(hasattr(foo_obj, "y"))

print(hasattr(foo_obj, "z"))

# hasattr:通过字符串 "func" 判断对象中是否存在该方法

print(hasattr(foo_obj, "func"))

  执行结果:

True

True

True

True

2、getattr

  通过 ”字符串“ 获取对象的属性值或方法

class Foo:

def__init__(self, x, y, z):

self.x = x

self.y = y

self.z = z

def func(self):

pass

foo_obj = Foo(10, 20, 30)


# getattr:通过字符串 "x"、"y"、"z" 来获取对象属性

print(getattr(foo_obj, "x"))

print(getattr(foo_obj, "y"))

print(getattr(foo_obj, "z"))

# getattr:通过字符串 "func" 来获取对象的绑定方法

print(getattr(foo_obj, "func"))

# 若该属性不存在,则返回 "不存在,默认值"

print(getattr(foo_obj, "a", "不存在,默认值"))

  执行结果:

10

20

30

<bound method Foo.func of <__main__.Foo object at 0x00000000021B6508>>

不存在,默认值

3、setattr

  通过 ”字符串“ 设置对象的属性值;若该属性不存在,即添加 ,若存在,即修改

class Foo:

def__init__(self, x, y, z):

self.x = x

self.y = y

self.z = z

def func(self):

pass

foo_obj = Foo(10, 20, 30)

# setattr:通过字符串 "x" 设置(修改)对象的属性值

print(getattr(foo_obj, "x"))

setattr(foo_obj, "x", 100)

print(getattr(foo_obj, "x"))

# 若不存在该属性,即添加该属性

setattr(foo_obj, "a", 200)

print(getattr(foo_obj, "a"))

  执行结果:

10

100

200

4、delattr

  通过 ”字符串“ 删除对象的属性或方法

class Foo:

def__init__(self, x, y, z):

self.x = x

self.y = y

self.z = z

def func(self):

pass

foo_obj = Foo(10, 20, 30)

# delattr:通过字符串 "x" 删除对象的属性或方法

print(hasattr(foo_obj, "x"))

delattr(foo_obj, "x")

print(hasattr(foo_obj, "x"))

  执行结果:

True

False

5、反射的应用场景

  场景:用于校验用户输入

class FileControl:

def run(self):

while True:

# 让用户输入上传或下载功能的命令

user_input = input("请输入上传(upload)或下载(download)功能, 输入"quit"退出>>> ").strip()

# 通过用户的字符串,调用相应的方法

if hasattr(self, user_input):

func = getattr(self, user_input) # func --> upload , func --> download

func()

elif user_input == "quit":

break

else:

print("输入有误...")

def upload(self):

print("文件正在上传...")

def download(self):

print("文件正在下载...")

file_obj = FileControl()

file_obj.run()

  执行结果:

请输入上传(upload)或下载(download)功能, 输入"quit"退出>>> upload

文件正在上传...

请输入上传(upload)或下载(download)功能, 输入"quit"退出>>> download

文件正在下载...

请输入上传(upload)或下载(download)功能, 输入"quit"退出>>> quit

以上是 反射 的全部内容, 来源链接: utcz.com/z/531145.html

回到顶部