python--反射(一)

简介: python--反射

什么是反射


反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

python 里的反射有下面四种方法

  • hasattr(obj,name_str):判断一个对象 obj 里是否有对应的 name_str 字符串的方法
  • getattr(obj,name_str):根据字符串去获取 obj 对象里的对应方法的内存地址
  • setattr(obj,"y",z):相当于 obj.y=z
  • delattr(obj,name_str):删除属性

命名空间.XXX == getattr(命名空间,"XXX")

类名.名字  

  • getattr(类名,"名字")

对象名.名字

  • getattr(对象,"名字")

模块名.名字

  • import 模块
  • getattr(模块,”名字“)

自己文件.名字

  • import sys
  • getattr(sys.modules['__main__'],"名字")

类,静态属性,类方法,静态方法都可以反射

class Student:
    ROLE = 'STUDENT'
    @classmethod
    def check_course(cls):
        print('查看课程了')
    @staticmethod
    def login():
        print('登录')
print(Student.ROLE)
print(getattr(Student, 'ROLE'))  # 反射查看属性
#  反射调用方法
getattr(Student, 'check_course')()  # 类方法
getattr(Student, 'login')()  # 静态方法

结果:

STUDENT
STUDENT
查看课程了
登录


hasattr和getattr


class Dog(object):
    def __init__(self, name):
        self.name = name
    def eat(self, food):
        print('%s is eating...' % self.name, food)
d = Dog('张三')
choice = input('请输入>>:').strip()
# 不能d.choice()   会报错,因为choice是字符串
print(hasattr(d, choice))  # 判断输入的在类里有没有这个方法,有返回True,否则False
print(getattr(d, choice))  # 返回了输入方法的内存对象
getattr(d, choice)('鸡蛋')  # 知道内存对象后加()传参调用

用户输入 eat 时,因为 Dog 类下有 eat 方法

请输入>>:eat
True
<bound method Dog.eat of <__main__.Dog object at 0x038D2070>>
张三 is eating... 鸡蛋

在输入 Dog 类下不存在的。比如 game

请输入>>:game
False
Traceback (most recent call last):
  File "E:/git_test1/djago_DRF/DRFApi/apps/mtauth/tests.py", line 16, in <module>
    print(getattr(d, choice))  # 返回了输入方法的内存对象
AttributeError: 'Dog' object has no attribute 'game'

因为Dog下没有 game ,所以报错了

所以可以做个判断,如果  hasattr(d, choice) 返回为 True了,在执行  getattr(d, choice)

改写后的如下

class Dog(object):
    def __init__(self, name):
        self.name = name
    def eat(self, food):
        print('%s is eating...' % self.name, food)
d = Dog('张三')
choice = input('请输入>>:').strip()
if hasattr(d, choice):  # 判断输入的在类里有没有这个方法
    func = getattr(d, choice)  # 有这个方法执行,获得输入    的在类里方法的内存对象
    func('鸡蛋')  # 将参数传给func,相当于执行d.eat('鸡蛋')

在输入 eat

请输入>>:eat
张三 is eating... 鸡蛋

输入 game


 

setattr


看如下例子

def bulk(self):  # 装到类里必须要有self
    print('%s in the bulking...' % self.name)
class Dog(object):
    def __init__(self, name):
        self.name = name
    def eat(self, food):
        print('%s is eating...' % self.name, food)
d = Dog('张三')
choice = input('请输入>>:').strip()
if hasattr(d, choice):  # 判断输入的在类里有没有这个方法
    func = getattr(d, choice)  # 有这个方法执行,获得输入的在类里方法的内存对象
    func('鸡蛋')  # 将参数传给func,相当于执行了d.eat('鸡蛋')
else:  # 输入的类里面的方法里没有
    setattr(d, choice, bulk)  # 等价于d.choice=bulk,动态加了个方法
    d.talk(d)  # 执行输入的,相当于执行了bulk,要把类对象传给,必须是d.输入的内容

输入 eat 时

请输入>>:eat
张三 is eating... 鸡蛋

输入不存在的 game 时

 

当输入 talk 时

 

这时用户只能输入 eat 或者 talk ,输入其他会报错

如果想让输入 Dog类下不存在的方法,都执行 talk 下的,就可以这样写

def bulk(self):  # 装到类里必须要有self
    print('%s in the bulking...' % self.name)
class Dog(object):
    def __init__(self, name):
        self.name = name
    def eat(self, food):
        print('%s is eating...' % self.name, food)
d = Dog('张三')
choice = input('>>:').strip()
if hasattr(d, choice):
    func = getattr(d, choice)  # 有这个方法执行,获得输入的在类里方法的内存对象
    func('鸡蛋')  # 将参数传给func,相当于执行了d.eat('鸡蛋')
else:  # 输入的类里面的方法里没有
    setattr(d, choice, bulk)  # 等价于d.choice=bulk,动态加了个方法
    func = getattr(d, choice)  # 获得新加方法的内存对象
    func(d)  # 调用新加的方法,不管输入什么,都执行的是bulk里的

输入 eat

>>:eat
张三 is eating... 鸡蛋

输入 game

>>:game
张三 in the bulking...

相关文章
|
3月前
|
测试技术 API 数据库
Python反射机制在实际场景中的应用
Python 的反射机制是指在运行时动态地访问、检测和修改类和对象的属性和方法。:通过反射机制,可以动态加载和执行插件,无需在代码中硬编码每个插件的具体实现。这样可以实现插件化架构,使系统更加灵活和可扩展。:可以使用反射机制来读取和解析配置文件中的配置项,并动态地应用到程序中。这样可以实现灵活的配置管理,方便根据需要进行配置项的修改和扩展。:在自动化测试框架中,可以利用反射机制动态地加载和执行测试用例,从而实现自动化测试的灵活性和扩展性。
37 2
|
4月前
|
Python
python反射
python反射
|
2月前
|
程序员 开发者 Python
Python动态属性与反射机制方式
通过反射和动态属性,Python程序员获得了巨大的权能,能在运行时访问、修改或为对象新增属性和方法,显著提高编程的智能化和适应性。内置的反射机制可能使开发者跨越编写代码时的限制,通过名称访问对象的特性、方法以及其他成员,为创建一个具有高度配置性、扩展性强大的应用程序打下基础。此外,利用getattr和setattr函数来获取和设定对象的属性,或是利用hasattr确认其是否存在某属性,甚至可以通过名字来动态地执行对象的函数。 总之,反射和动态属性对于Python的程序开发而言是重要的工具,它们不仅提供了编写效率高且灵活的代码的能力,还为构建可高度定制和扩展的应用程序提供了可能。对于熟练掌握这些
|
3月前
|
安全 Python
深入浅出Python反射机制
1. 什么是反射 简单来说,反射就是程序在运行时能够"观察"自己,获取、检查和修改自身状态或行为的一种能力。听起来有点抽象?别急,我们慢慢道来。 在Python中,反射允许我们在代码运行时: • 查看对象有哪些属性和方法 • 获取属性的值 • 调用对象的方法 • 甚至动态地添加或修改属性和方法
|
3月前
|
Python
python反射 , 异常处理
python反射 , 异常处理
|
3月前
|
网络架构 Python
python的反射机制
python的反射机制
12 0
|
3月前
|
Python
Python反射和异常处理
Python反射和异常处理
|
4月前
|
Python
Python中的反射
Python中的反射
125 5
|
4月前
|
Python
解释一下Python中的反射机制。
解释一下Python中的反射机制。
24 1
|
测试技术 Python
Python--getattr反射+selenium详解篇
Python--getattr反射+selenium详解篇
73 0