首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

__setattr__ 仅当属性不存在时

setattr 是Python中的一个特殊方法,用于设置对象的属性值。它在对象的属性赋值时被调用。

setattr 方法的语法如下:

代码语言:python
复制
def __setattr__(self, name, value):
    # 设置属性值的逻辑

当我们给对象的属性赋值时,Python会自动调用对象的setattr方法来完成属性的设置。该方法接受三个参数:self、name和value。其中,self表示当前对象,name表示属性的名称,value表示属性的值。

setattr 方法的作用是在属性赋值时进行一些额外的逻辑处理,例如验证属性值的合法性、触发其他操作等。通过重写setattr方法,我们可以自定义属性赋值的行为。

需要注意的是,如果在setattr方法中直接使用self.name = value 的方式给属性赋值,会导致递归调用setattr方法,从而陷入死循环。为了避免这种情况,我们可以使用super().setattr(name, value) 来调用父类的setattr方法,或者使用object.setattr(self, name, value) 来直接设置属性值。

setattr 方法的应用场景包括但不限于:

  1. 属性值验证:可以在setattr方法中对属性值进行验证,确保其符合特定的规则或范围。
  2. 属性变化触发:可以在setattr方法中触发其他操作,例如属性变化时发送通知、更新相关数据等。
  3. 动态属性:可以在setattr方法中根据属性名称的不同,动态生成属性或调用不同的逻辑。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供弹性计算能力,满足各类业务需求。产品介绍链接
  • 云数据库 MySQL 版(CDB):提供稳定可靠的云数据库服务,支持高可用、备份恢复等功能。产品介绍链接
  • 人工智能机器学习平台(AI Lab):提供丰富的人工智能算法和模型,帮助开发者快速构建和部署AI应用。产品介绍链接
  • 云存储(COS):提供高可靠、低成本的对象存储服务,适用于图片、视频、文档等各类数据的存储和管理。产品介绍链接
  • 腾讯云区块链服务(Tencent Blockchain):提供一站式区块链解决方案,支持快速搭建和管理区块链网络。产品介绍链接
  • 腾讯云游戏多媒体引擎(GME):提供音视频通信和处理能力,支持游戏语音、实时音视频等场景。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

css属性width设为100%

平常在写页面html代码,经常会使用到width:100%来使控件宽度为父控件的内容宽度。但如果父控件为body,而且没有明确设置body的宽度,那么就会出现以下的情况了。  ...浏览器宽度调到出现水平滚动条: ? 使用水平滚动条,浏览右边部分时: ? 结果右边没有灰色背景。...分析:在没有明确设定body的宽度,body的宽度就是浏览器可显示区域的宽度,上面的例子中可显示区域的宽度明显小于1000px,也就是说body的宽度远远小于1000px。...所以body下的控件宽度被设为100%,也只能是等于或小于浏览器可显示的宽度。 解决方法: 1.body设定明确的宽度。 2.如果body不能设定明确的宽度。

1.3K50

python 魔术方法(一) 自定义容器类与类属性控制

方法发现 key 不存在,就会调用你的 __missing__ 方法了。...获取不存在属性名 — __getattr__ __getattr__(self, name) 通过类实例点属性名可以实现类属性的访问,但有时我们需要定义当属性不存在的行为,这时就需要实现魔术方法:...__getattr__ 这个方法只有在用户访问的类属性不存在才会被调用,通常,你可以在实现的 __getattr__ 中做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性的彻底控制...,只要在类外为不存在属性赋值,改属性就会被创建,而 __getattr__ 只有在属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr...删除属性 — __delattr__ __delattr__(self, name) 每一次用户使用 del 关键字删除某个属性,解释器就会自动调用魔术方法 __delattr__ 因此,与 __setattr

55720

面向对象-魔术方法

对未定义的属性名称和实例进行点号运算,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法 __setattr__ 会拦截所有属性的的赋值语句。...这个需要注意,当在__setattr__方法内对属性进行赋值,不可使用self.attr = value,因为他会再次调用self....He is %d years old"%(self.name, self.age) # 使用点语法访问不存在属性被自动调用 # 作用:调用某些不存在属性不想报错,想返回一个默认值...def __getattr__(self, item): print("__getattr__") return "%s属性不存在"%item # 调用点语法设置属性被自动调用...__dict__[key] = value # 调[属性名]语法设置属性被自动调用 # def __setitem__(self, key, value): #

21830

Python中反射和描述器总结

函数与方法 内建函数: getattr(object,name[,degault])  通过name返回object的属性值,当属性不存在,将使用default返回,如果没有default,则抛出AttributeError...setattr(object,name,value)  object的属性存在,则覆盖,不存在,新增。...一般不使用该方法 魔术方法 __getattr__() 通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法 __setattr__() 通过.访问实例的属性,进行增加,修改都要调用它 __delattr...__() 通过实例来删除属性时调用此方法 __getattribute__() 实例所有的属性调用都从这个方法开始 属性查找顺序: 实例调用__getattribute__() --> Instance...如果实现了__get__,就是非数据描述符non-data descriptor 同时实现了__get__,__set__就是数据描述符 data descriptor 如果一个类的类属性设置为描述器实例

89320

Python进阶——如何正确使用魔法方法?(上)

访问控制 接下来,我们来看关于访问控制的魔法方法,主要包括以下几种: __setattr__:通过「.」设置属性或 setattr(key, value) 设置属性时调用 __getattr__:访问不存在属性时调用...__getattr__ 再来看 __getattr__,由于我们在 __setattr__ 中忽略了对 gender 属性的赋值,所以访问这个不存在属性,会调用 __getattr__ 方法,在这个方法中返回了默认值...很多同学以为这个方法与 __setattr__ 方法对等的,一个是赋值,一个是获取。其实不然,__getattr__ 只有在访问「不存在属性才会被调用,这里我们需要注意。...很多人经常把这个方法和 __getattr__ 混淆,通过例子我们可以看出,它与前者的区别在于: __getattr__ 只有在访问不存在属性被调用,而 __getattribute__ 在访问任意属性都会被调用...__delattr__ 最后,我们来看 __delattr__,它比较简单,删除对象的某个属性,这个方法会被调用,所以它一般会用在删除属性前的校验场景中使用。

62231

__setattr__,setattr(),getattr__,getattr()及__getattribute__的区别

Python 2.7 IDE Pycharm 5.0.3 首先,给一波定义 __setattr__(self,name,value) #试图给特性name赋值时候自动被调用,其余方法同理 #相当于触发机制...__(self, key, value): #给特性key赋值时候会被自动调用 if key == 'value1':#name这个特性是'value1' print "key=value1候跳进来了...__getattribute__(name)#__getattribute__name被访问就被调用 except: return name + ' is not found!'...__setattr__()中 print "---------c.name--------" print c.name#动态建立属性name,本身在class中不存在,故才调用__getattr__ print...本站提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

32820

Python 类的高级函数(双下横线)

类的高级函数(双下横线) __str__ 介绍 如果定义了该函数, print当前实例化对象的时候, 会返回改函数的return信息 用法 def __str__(self): return str_type...参数 无 返回值 一般返回对于该类的描述信息 __gatattr__ 介绍 调用的属性或方法不存在,会返回该方法定义的信息 用法 def __gatattr__(self, key): print...参数 key : 调用任意不存在属性名 返回值 可以是任意类型也可以不进行返回 代码片段1 # coding:utf-8 class Test(object): def __str__(self...) print(t.b) __setattr__ 功能 拦截当前类中不存在属性与值 用法 def __settattr__(self, key, value): self....'.format(key)) return '这个key:{}并不存在'.format(key) def __setattr__(self, key, value):

79910

Python 中的魔术方法

__getattr__(self, name): 该方法定义了你试图访问一个不存在属性的行为。因此,重载该方法可以实现捕获错误拼写然后进行重定向, 或者对一些废弃的属性进行警告。...也可用于访问私有属性 __setattr__(self, name, value): 是实现封装的解决方案,它定义了你对属性进行赋值和修改操作的行为。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__要避免”无限递归”的错误。...def __setattr__(self, name, value): self.name = value # 每一次属性赋值, __setattr__都会被调用,因此不断调用自身导致无限递归了...正确为: def __setattr__(self, name, value): self.__dict__[name] = value

66820

Python 开发者不得不知的魔术方法(Magic Method)

我们来看一下: __getattr__(self, name) 定义当用户试图获取一个不存在属性的行为。...无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__要避免”无限递归”的错误。...__getattribute__(self, name) __getattribute__定义了你的属性被访问的行为,相比较,__getattr__只有该属性不存在才会起作用。...__reversed__(self) 实现reversed()被调用时的行为。应该返回序列反转后的版本。序列可以是有序的时候实现它,例如对于列表或者元组。...创建面向对象的数据库或者类,里面含有相互依赖的属相,描述器将会非常有用。一种典型的使用方法是用不同的单位表示同一个数值,或者表示某个数据的附加属性

89270

Python魔术方法-Magic Method

我们来看一下: __getattr__(self, name): 定义当用户试图获取一个不存在属性的行为。...无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__要避免"无限递归"的错误。...__getattribute__(self, name): __getattribute__定义了你的属性被访问的行为,相比较,__getattr__只有该属性不存在才会起作用。...__reversed__(self): 实现reversed()被调用时的行为。应该返回序列反转后的版本。序列可以是有序的时候实现它,例如对于列表或者元组。...创建面向对象的数据库或者类,里面含有相互依赖的属相,描述器将会非常有用。一种典型的使用方法是用不同的单位表示同一个数值,或者表示某个数据的附加属性

81360

Python 黑魔法之属性拦截

当我们访问某个类或者是实例属性的时候,如果它不存在的话,就会出现异常。对于异常,我们总是要处理的,接下来就让我们来看,是怎么处理的。...__getattr__(self,name):如果 name 被访问且它又不存在,那么这个方法将被调用。 3....上面的例子中类 Sample 只有两个方法,下面让我们实例化一下: >>> s = Sample() >>> s.x hello getattr s.x 这个实例属性本来是不存在的,但是由于类中有了 _..._getattr__(self,name) 方法,发现属性 x 不存在于对象的 __dict__ 中,就调用了 __getattr__,也就是所谓的「拦截成员」。...>>> s.x = 7 hello setattr 同理,给对象的属性赋值的时候,调用了 __setattr__(self,name,value) 方法,这个方法中有 self.

59310
领券