python反射技术使用(动态变量名)

需求:需要通过动态变量名,取得对应的值。

例如,定义有如下类(也许是自己设计的表结构不合理),时不时需要获取或设置变量 env_* 变量的值然后更新数据库,所以急需使用变量名的变量,要不就需要写一堆判断语句:

# 发布单 model
class Order(models.Model):
    current_env = models.IntegerField(default=0)  # 0:刚新建,1-5:对应测试环境/生产环境等等
    env_1 = models.IntegerField(default=0)   # 环境间流转状态,0:没开始,1:待发布,2:已发布
    env_2 = models.IntegerField(default=0)
    env_3 = models.IntegerField(default=0)
    env_4 = models.IntegerField(default=0)
    env_5 = models.IntegerField(default=0)

使用python自带的 getattr()、setattr()方法

	# 过滤刚新建还没流转的发布单
    orders = Order.objects.all().exclude(env_1=0, env_2=0, env_3=0, env_4=0, env_5=0)
    for order in orders:
        env_id = order.current_env
        env_name = Environment.objects.filter(env_id=env_id)[0].env_name
        # 变量名的变量,使得反射技术,
        arg_name = "env_" + str(env_id)
        arg_name_value = getattr(order, arg_name)   ## 获取到值
        ## setattr(order, arg_name, 2)     ## 设置对应的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,反射指的是在运行时动态地获取对象的属性和方法。Python中的反射机制可以通过内置函数getattr()、setattr()、hasattr()、delattr()和dir()来实现。 - getattr(obj, name[, default]):获取对象obj中名为name的属性。如果属性不存在,则返回default值(默认为None)。 - setattr(obj, name, value):给对象obj的名为name的属性赋值为value。 - hasattr(obj, name):判断对象obj中是否存在名为name的属性,返回True或False。 - delattr(obj, name):删除对象obj中名为name的属性。 - dir([obj]):列出对象obj的所有属性和方法。如果没有提供obj,则列出当前作用域中的所有变量、函数和类。 示例代码: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print(f'Hello, my name is {self.name}, and I am {self.age} years old.') p = Person('Alice', 25) # 使用getattr获取对象属性 print(getattr(p, 'name')) # 输出:Alice # 使用setattr设置对象属性 setattr(p, 'age', 30) p.say_hello() # 输出:Hello, my name is Alice, and I am 30 years old. # 使用hasattr判断对象是否存在属性 print(hasattr(p, 'gender')) # 输出:False # 使用delattr删除对象属性 delattr(p, 'age') p.say_hello() # 报错:'Person' object has no attribute 'age' # 使用dir列出对象的所有属性和方法 print(dir(p)) ``` 需要注意的是,在使用getattr获取方法时,需要使用getattr(p, 'say_hello')()的形式进行调用,因为getattr返回的是方法本身,而不是方法的返回值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值