Python动态设置类属性:setattr、getattr、delattr、hasattr

        前言:在Python编程中,我们在一些场景需要用到类属性存储或读取,那我们应该如何去灵活使用呢?下面就一起康康吧

一、设置类属性——setattr(object,key,value)

例子:

class E_Test:

    def __init__(self,age):
        self.age = age

    def we(self):
        pass
me  = E_Test("18")#先实例化类
setattr(me,"name","小阿卷")#设置属性
print(me.__dict__) 


响应:

{'age': '18', 'name': '小阿卷'}

二、删除已有类属性——delattr(object,key)

class E_Test:

    def __init__(self,age):
        self.age = age

    def we(self):
        pass

me  = E_Test("18")
print(me.__dict__)
print(delattr(me,"age"))
print(me.__dict__)


响应:
{'age': '18'}
None
{}

三、获取类属性——getattr(object,key,"属性不存在的时候返回的值,避免报错")

class E_Test:

    def __init__(self, age):
        self.age = age

    def we(self):
        pass


me = E_Test("小阿卷")
print(getattr(me, "name", "没获取到")) #获取name属性,没有就提示“没获取到”


#响应:

没获取到

四、获取类属性——hasattr(object,key)

class E_Test:

    def __init__(self,age):
        self.age = age

    def we(self):
        pass


me  = E_Test("18") #初始化,填写age=18
print("原类属性:",me.__dict__)
if hasattr(me,"name"): #如果类中有"name"这个属性,就打印“有这个属性了”
    print("有这个属性了")
else:
    setattr(me,"name","添加了name") #如果上面的if条件不满足,那就是设置在类中设置一个属性:key:"name",val:"添加了name"
print("修改后的类属性:",me.__dict__)


响应:

原类属性: {'age': '18'}
修改后的类属性: {'age': '18', 'name': '添加了name'}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 反射指的是在运行时动态地访问对象属性或方法的能力,常用于框架开发以及编写通用代码等方面。在Python中,常用的反射方法有以下4个: 1. getattr(obj, name[, default]):获取对象属性,如果属性不存在则返回指定的默认值,默认值可选。 2. setattr(obj, name, value):设置对象属性,如果属性不存在则创建新属性。 3. delattr(obj, name):删除对象属性,如果属性不存在则抛出AttributeError异常。 4. hasattr(obj, name):判断对象是否有指定的属性,返回True或False。 举例说明: 假设有以下代码: class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print("Hello, I'm", self.name) person = Person("Tom", 18) 1. 获取对象属性: name = getattr(person, "name") # 获取person对象的name属性 print(name) # 输出:Tom gender = getattr(person, "gender", "Unknown") # 获取person对象的gender属性,由于不存在,返回指定的默认值 print(gender) # 输出:Unknown 2. 设置对象属性setattr(person, "gender", "Male") # 为person对象设置gender属性 gender = getattr(person, "gender") # 获取person对象的gender属性 print(gender) # 输出:Male 3. 删除对象属性delattr(person, "gender") # 删除person对象的gender属性 gender = getattr(person, "gender", "Unknown") # 再次获取person对象的gender属性,由于已被删除,返回指定的默认值 print(gender) # 输出:Unknown 4. 判断对象是否有指定属性: has_name = hasattr(person, "name") # 判断person对象是否有name属性 print(has_name) # 输出:True has_gender = hasattr(person, "gender") # 判断person对象是否有gender属性 print(has_gender) # 输出:False ### 回答2: 在Python中,反射是指通过字符串的形式来访问、操作、修改对象的属性、方法和等。Python提供了四个内置的反射方法,分别是getattr()、hasattr()、setattr()和delattr()。 1. getattr():该方法用于获取对象的属性或方法。语法为getattr(object, name[, default]),其中object为需要获取属性或方法的对象,name为属性或方法的名称,default为可选参数,表示当属性或方法不存在时的默认返回值。例如: ```python class MyClass: def __init__(self): self.name = "Alice" def say_hello(self): print("Hello, world!") obj = MyClass() print(getattr(obj, "name")) # 输出:Alice getattr(obj, "say_hello")() # 输出:Hello, world! ``` 2. hasattr():该方法用于判断对象是否有指定的属性或方法。语法为hasattr(object, name),其中object为需要判断的对象,name为属性或方法的名称。如果对象具有该属性或方法,则返回True,否则返回False。例如: ```python class MyClass: def __init__(self): self.name = "Alice" def say_hello(self): print("Hello, world!") obj = MyClass() print(hasattr(obj, "name")) # 输出:True print(hasattr(obj, "say_hello")) # 输出:True print(hasattr(obj, "age")) # 输出:False ``` 3. setattr():该方法用于设置对象的属性或方法。语法为setattr(object, name, value),其中object为需要设置属性或方法的对象,name为属性或方法的名称,value为需要设置的值。例如: ```python class MyClass: pass obj = MyClass() setattr(obj, "name", "Alice") obj.name # 输出:Alice def say_hello(self): print("Hello, world!") setattr(obj, "say_hello", say_hello) obj.say_hello() # 输出:Hello, world! ``` 4. delattr():该方法用于删除对象的属性或方法。语法为delattr(object, name),其中object为需要删除属性或方法的对象,name为属性或方法的名称。例如: ```python class MyClass: def __init__(self): self.name = "Alice" def say_hello(self): print("Hello, world!") obj = MyClass() delattr(obj, "name") print(hasattr(obj, "name")) # 输出:False delattr(obj, "say_hello") print(hasattr(obj, "say_hello")) # 输出:False ``` ### 回答3: 在Python中,反射是指通过字符串的形式来访问、调用对象的属性或方法的一种机制。这种机制使得我们可以在运行时动态地确定对象的结构和操作。 反射有许多方法,下面是其中的4个常用方法及其用法的例子: 1. getattr() 方法:通过对象和属性名的字符串形式获取对象的属性值。例如,假设有一个名为 person 的对象,我们可以使用 getattr(person, 'name') 来获取 person 对象的名字。 2. hasattr() 方法:用于判断对象是否包含指定的属性。如果对象包含该属性,返回 True;反之,返回 False。例如,通过使用 hasattr(person, 'age') 我们可以判断 person 对象是否包含 age 属性。 3. setattr() 方法:通过对象、属性名的字符串形式以及属性值来设置对象的属性。例如,我们可以使用 setattr(person, 'age', 25) 将 person 对象的年龄属性设置为 25。 4. delattr() 方法:通过对象和属性名的字符串形式来删除对象的属性。例如,我们可以使用 delattr(person, 'name') 来删除 person 对象的名字属性。 上述方法可以帮助我们在运行时动态地操作对象的属性和方法,使得代码更加灵活和可扩展。但需要注意的是,反射的使用应该谨慎,因为它可能会导致代码的可读性和维护性下降,同时也可能存在安全风险。因此,在使用反射时需要慎重考虑,并选择合适的方式来实现代码的灵活性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值