Python笔记_第四篇_高阶编程_反射_(getattr,setattr,deattr,hasattr)

1. 元数据和反射概念

  有关程序及其类型的数据成为元数据(metadata),他保存在程序的程序集中。

  反射这个词儿听起来比较陌生。程序在运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据的行为成为反射(reflection)

  对象浏览器是显示元数据的程序的的一个示例。他可以读取程序集,然后显示所包含的类型及类型的所有特性和成员。

2.举例说明

  比如:我们现在有这样一个需求,已有三个函数fun1,fun2,fun3这三个函数,我们都找到如果我们想调用其中某个函数的时候,我们只有在代码中写好,

  s.py

def fun2():
    return "fun2"


def fun1():
    return 'fun1'


def fun3():
    return 'fun3'

  test.py

import s  #导入s.py文件。

call_str = input("input which function you want to call :")

if call_str == 'fun1':
    print(s.fun1())
elif call_str == 'fun2':
    print(s.fun2())
elif call_str == 'fun3':
    print(s.fun3())
else:
    print("404 not Found")

  运行文件test.py后输入对应的函数名就可以调用响应的函数了。如果在s.py文件中,有成千个函数!岂不是我们想象以上方式调用的时候写上n个判断语句,这样是不是太麻了。

  所有Pyt给我们提供了强大的反射机制,这个反射机制是通过“字符串返回映射到代码中的一种机制”。

扫描二维码关注公众号,回复: 6272187 查看本文章

  这边是反射的意思了。

3.Py中怎么使用反射

  其中Py中提供了四个反射函数

  3.1 getattr函数:获取对象的方法或变量的内存地址

import s

call_str = input("input which function you want to call :")

# if call_str == 'fun1':
#     print(s.fun1())
# elif call_str == 'fun2':
#     print(s.fun2())
# elif call_str == 'fun3':
#     print(s.fun3())
# else:
#     print("404 not Found")

obj = getattr(s, call_str) # 其中的s是值的带入的s文件,s也可以换为其他的你想倒入的模块等
print(obj())

input which function you want to call :fun1
fun1

  运行后我们输入:fun1,fun2,fun3都没有问题,但是当我们乱输入一个字符串的时候getattr内置函数就报错了。当然,我们可以通过try...except语句进行判断这个问题。但是我们还可以使用hasattr这个内置函数。

  3.2 hasatter函数:返回True or False

import s

call_str = input("input which function you want to call :")

if call_str == 'fun1':
    print(s.fun1())
elif call_str == 'fun2':
    print(s.fun2())
elif call_str == 'fun3':
    print(s.fun3())
else:
    print("404 not Found")

    
if hasattr(s, call_str):    # 判断是否存在函数 call_str,这样处理就不会报错了。
    obj = getattr(s, call_str)
    print(obj())
else:
    print("404 not Found")

  3.3 setattr函数:为对象添加变量或方法

def abc(self):
    print("%s正在交谈"%self.name)

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

class Person(object):
    def __init__(self,name):
        self.name = name
    def talk(self):
        print("%s正在交谈"%self.name)

p = Person("laowang")
setattr(p,"talk",abc)   # 将abc函数添加到对象中p中,并命名为talk
p.talk(p)               # 调用talk方法,因为这是额外添加的方法,需手动传入对象


setattr(p,"age",30)     # 添加一个变量age,复制为30
print(p.age)            # 打印结果:30

  3.4 delattr函数:输出对象中的变量。注意不能删除方法

class Person(object):
    def __init__(self,name):
        self.name = name
    def talk(self):
        print("%s正在交谈"%self.name)

p = Person("laowang")

delattr(p,"name")       # 删除name变量
print(p.name)           # 此时将报错

猜你喜欢

转载自www.cnblogs.com/noah0532/p/10923290.html