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

在基类中重写__setattr__后初始化时的AttributeError

在基类中重写__setattr__后,初始化时可能会出现AttributeError的错误。

__setattr__是Python中的特殊方法,用于设置属性的值。当我们在一个类中重写了__setattr__方法时,它会拦截对所有属性的设置操作,包括初始化时对属性的设置。

在初始化一个对象时,Python会调用__setattr__方法去设置属性的值。如果在__setattr__方法中出现错误,例如属性名不存在或者属性值不合法,就会抛出AttributeError异常。

例如,假设我们有以下基类BaseClass

代码语言:txt
复制
class BaseClass:
    def __setattr__(self, name, value):
        # 拦截对属性的设置操作
        if name == 'attribute':
            # 设置属性值
            self.attribute = value
        else:
            # 抛出AttributeError异常
            raise AttributeError(f"Cannot set attribute '{name}'")

当我们实例化一个对象并初始化属性时,如果属性名不是'attribute',就会抛出AttributeError异常:

代码语言:txt
复制
obj = BaseClass()
obj.attribute = 'value'  # 设置属性值正常
obj.other_attribute = 'value'  # 抛出AttributeError异常

这种情况下,可以通过在__setattr__方法中添加条件判断来解决该错误。可以根据不同的属性名执行不同的设置操作,或者在属性名不合法时抛出自定义的异常。

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

  • 腾讯云云服务器(CVM):提供可靠、可扩展的云端计算服务。产品介绍链接
  • 腾讯云云数据库 MySQL 版(CDB):可扩展、高性能、高可用的关系型数据库。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、低成本的对象存储服务,可存储和检索任意数量的数据。产品介绍链接
  • 腾讯云人工智能平台(AI Lab):提供丰富的人工智能算法和模型,帮助开发者快速构建智能应用。产品介绍链接
  • 腾讯云物联网平台(IoT Explorer):提供全球覆盖的物联网设备接入和管理服务,支持海量设备连接和数据处理。产品介绍链接
  • 腾讯云移动推送(TPNS):提供高效、稳定的移动应用消息推送服务,支持多种推送方式和个性化推送策略。产品介绍链接

请注意,以上仅为示例,实际的产品选择应根据具体需求和情况进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何通过一些骚操作有效控制Python

平时工作,能用到基本都是可变,无论是实例属性,还是属性,也正是因为这样,所以python也是一个“鸭子类型”编程语言。...__ AttributeError: has no attribute abc 这里关键点有2个: __slots__ 方法,,使用__slots__方法可以控制属性和方法...,定义完,我对b....但是大家一定要注意,使用__slots__是有风险,由于强制限制了__dict__使用,那么你要添加任何方法和属性时候就得重写这个了,并且继承B子类,也需要重写__slots__方法。...__setattr__方法,我们__init__这个构造函数,添加了这个方法,目的是为了设置一个__slots__存在属性值,而在__setattr__函数,我们重写了他,致使对任意和实例属性进行修改时候

54640

SQL学习笔记之简易ORM

__init__(name, 'int', primary_key, default_value) 0x02 定义元 数据库每个表,都有表名,每一列列名,以及主键是哪一列。...既然我要用数据库表,对应这一个程序,那么我这个也应该有这些类属性。 但是不同这些类属性又不尽相同,所以我应该怎么做?...里拦截创建过程,然后把这些东西取出来,放到里面, 所以用到了元。...__new__(cls,name,bases,attrs) 0x03 定义Model Model是所有要对应数据库表,每个数据库表对应对象,都应该有查询,插入,保存,方法。...,0和None表示不限制连接数 mincached=6, # 初始化时,链接池中至少创建空闲链接,0表示不创建 maxcached=5, # 链接池中最多闲置链接,0和None

34910
  • 关于使用MethodHandle子类调用祖父重写方法探究

    关于使用MethodHandle子类调用祖父重写方法探究 注:这个例子原本出现在周志明先生《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...这里直接看Sonthinking方法(关于为何这样实现,《深入理解Java虚拟机》读书笔记(七)--虚拟机字节码执行引擎(下)也解释了)。...普通方法调用,这个this参数是虚拟机自动处理,表示是当前实例对象,我们方法可以直接使用。...我觉得使用bindTo绑定方法接收者要比invoke方法传递更加友好,也更加符合程序员大众理解,invoke可以只专注方法显式入参。 然后再来说bindTo(this)this。...基于这个事实,我们这时可以直接在GrandFatherthinking方法调用Son独有的方法,使用反射或者直接类型强制转换为Son就行了。

    9.5K30

    python __setattr__, __getattr__,__getattribute__, __call__使用方法

    如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有实例__dict__或它构造__dict__或__dict...如果类自定义了__setattr__方法,当通过实例获取属性尝试赋值时,就会调用__setattr__。常规对实例属性赋值,被赋值属性和值会存入实例属性字典__dict__。...定义self.attr也同样,所以__setattr__下还有self.attr赋值操作就会出现无线递归调用__setattr__情况。...自己实现__setattr__有很大风险,一般情况都还是继承object__setattr__方法。...__dict__) # 由于调用'__setattr__', name属性没有加入实例属性字典

    1.3K70

    Python object特殊方法代码讲解

    2)与__getattr__区别 我们实现,可以重写__getattr__方法,那么__getattr__方法和__getattribute__方法有什么区别?...而__getattr__只属性不存在时调用,默认会抛出 AttributeError: ‘Foo’ object has no attribute ‘age’ 这样错误,但我们可以对其进行重写,做我们需要操作...__被重写(不调用父__setattr__的话)。...特别注意,构造函数对属性进行初始化赋值时也是调用了该方法: class Foo(object): def __init__(self): self.name = 'Alex' # 这里也要调用_...当我们需要重写__setattr__方法时候,就要注意初始化时要使用object__setattr__初始化: class Local(object): def __init__(self):

    84030

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

    魔法方法概览 首先,我们先对 Python 魔法方法进行归类,常见魔法方法大致可分为以下几类: 构造与初始表示 访问控制 比较操作 容器操作 可调用对象 序列化 由于魔法方法分类较多,这篇文章我们先来看前几个...我们定义时候,通常都会去定义构造方法,它作用就是初始化一个对象时,定义这个对象初始值。...AttributeError p2 = Person() p2.age = -1 # __setattr__引发ValueError 我们仔细看一下这个例子,我已经添加好了详细注释...__getattr__ 再来看 __getattr__,由于我们 __setattr__ 忽略了对 gender 属性赋值,所以当访问这个不存在属性时,会调用 __getattr__ 方法,在这个方法返回了默认值...构造与初始魔法方法,常常用在初始化过程,其中 __init__一般用于实例初始化, 而 __new__ 可以改变初始化实例行为,通过它我们可以实现一个单例或者继承一个内置

    69031

    Python反射和描述器总结

    反射 Python,能够通过一个对象,找出type、class、attribute或者method能力,成为反射。...__dict__-->继承祖先(直到object)__dict__---找不到--> 调用__getattr__() __setattr__() 可以拦截对实例属性增加、修改操作,如果要设置生效...__grtattribute__方法为了避免该方法无限递归,他实现应该永远调用同名方法以访问需要任何属性,例如:object.__getattribute__(self,name)。...一般不使用该方法 魔术方法 __getattr__() 当通过搜索实例、实例及祖先查不到属性,就会调用此方法 __setattr__() 通过.访问实例属性,进行增加,修改都要调用它 __delattr...描述器: 描述器定义 python,一个实现了__get__、__set__、__delete__三个方法任何一个方法,就是描述器。

    92520

    Python指南:高级程序设计之面向对象程序设计进阶

    __getattr__() 以下情况下调用: 属性不在实例dict; 属性不在其以及祖先dict ; 触发AttributeError 异常时(不仅仅是get_attribute() 引发异常...3.当__getattr__ 和__getattribute__ 同时被定义时,要么显示__getattribute__ 调用,要么抛出AttributeError异常,否则__getattr__...,函子是指一个对象,该对象可以向函数一样进行调用, Python ,函子就是另一种类型函数对象。...使用上下文管理器可以简化代码,这是通过确保某些操作特定代码块执行前与执行再进行来实现。... with 语句内创建上下文管理器时,其 __enter__()方法会自动被调用, with 语句、上下文管理器作用范围之外时,其__exit__() 方法会自动被调用。

    87820

    【Python大神秘籍Top10】这些窍门99%的人都不知道

    Python神奇指南目录 简介 搭建与初始自定义运用操作符 神奇方法比较 神奇方法数字 描述自定义 控制属性访问 制作自定义序列 反射 可调用对象 上下文管理器 构建描述符对象...让我们更近地观察下这3个神奇方法吧: __new__(cls, […) 一个对象实例化时__new__是第一个被调用方法。传递其他任何参数到__init__。...创建对象,python解释器默认调用__init__()方法。无论主构造函数调用什么,它都会被传递。__init__几乎Python定义普遍使用。...__getattribute__只能在新式中使用(Python最新版本,所有的都是新式稍旧版本你可以通过继承object来创建一个新式。...它允许你定规则,在任何时候不管一个类属性值那时候是否可访问。)它会因为他同伴出错连坐受到某些无限递归问题困扰(这时你可以通过调用__getattribute__方法来防止发生)。

    71020

    为什么Java成员变量不能被重写?成员变量Java能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域方法

    这篇文章讨论了Java面向对象概念中一个基本概念--Field Hiding(成员变量隐藏) 成员变量Java能够被重写么?...不会重写成员变量,而是隐藏成员变量 Java文档对隐藏域定义: Within a class, a field that has the same name as a field in the superclass...意思就是: 一个,子类成员变量如果和父成员变量同名,那么即使他们类型不一样,只要名字一样。父成员变量都会被隐藏。子类,父成员变量不能被简单用引用来访问。...其实,简单来说,就是子类不会去重写覆盖父成员变量,所以成员变量访问不能像方法一样使用多态去访问。...访问隐藏域方法 就是使用父引用类型,那么就可以访问到隐藏域,就像我们例子代码 就是使用类型转换System.out.println(((Super)c1).s); 翻译自http://www.programcreek.com

    3.5K40

    python特列方法使用

    __new__方法实例化为一个对象,此方法是对这个对象 参数初始化(先执行__new__,再执行__init)') self.name = name self.gender...,即 key-val 类型 但是此方法 需要用到 类属性,多次实例化时,类属性值共享,所以 需要注意 使用情况 使用事例 如下方 代码 :param...:return: """ print('访问未定义属性时,调用此方法,如果不显示引用此方法 则程序直接报错;此方法属性访问顺序末端')...__(self, key, value): """ 此__setattr__ 在对实例 赋值,或者__init__初始化参数时,调用此方法,注意 此方法里面 不要使用...__dict__) __all__ = ['SetattTest', 'AttTestOne'] """ __all__方法 里面是 函数或 常量 或 名字,一般 __init__.py 文件中使用

    1.3K20

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

    魔术方法”,让我们方便实现 Python 核心需要特性,让你使用更加方便: 迭代器 集合 属性访问 运算符重载 函数和方法调用 对象创建和销毁 字符串表示形式和格式化 运行上下文管理 同时,实现这些魔术方法...特殊方法是 Python 解释器自动调用,因此你无需自己处理,但是,需要注意是,这些特殊方法是如此强大,同时也存在着很多陷阱,使用必须处处小心谨慎。 3. 自定义容器 3.1....__getattr__ 这个方法只有在用户访问类属性不存在时才会被调用,通常,你可以实现 __getattr__ 做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性彻底控制..._main__': test = TechlogTest() test.hello = 'world' 上面这段代码看上去非常简单,初始化时,TechlogTest 有一个 values...因为 __init__ 方法,对 values 成员初始行为让解释器自动去调用了 __setattr__ 方法,而在 __setattr__ 方法,values 成员尚未被创建,因此抛出了异常

    61520

    Python反射

    参考链接: Python反射 反射  运行时,区别于翻译时,指的是程序被加载到内存执行时候。 反射,reflection,指的是运行时获取类型定义信息。...简单说,Python,能够通过一个对象,找出其type、class、attribute或method能力,称为反射或自省。...__dict__) print(p1.x)  实例通过.点号设置属性,例如self.x=x,就会代用__setattr__(),属性要加到实例__dict__,就需要自己完成。...异常  它return值将作为属性查找结果如果抛出AttributeError异常,则会直接调用__getattr__方法,因为属性没有找到 __getattribute__方法为了避免该方法无线递归...,它实现应该永远调用同名方法以访问需要任何属性,需要注意是,除非明确知道__getattrtbute__方法用来做什么,否则不要使用  魔术方法意义getattr()当通过搜索实例,实例及祖先查找不到属性

    86600

    python面向对象多态-相关内置函数-内置魔法函数-迭代器协议-上下文管理-04

    (不同对象类型,拥有相同方法,不同结果) # 不管什么类型,他都与type这个方法 ---> python多态体现 # 多态python其实很常见,因为到处充斥着继承与组合 a = 10...Person: def __str__(self): # 重写object __str__ print("__str__ run") return 'abc...): self.name = name self.age = age def __del__(self): # 重写object __str__...时将导致这个对象不再添加__slots__定义之外属性 __getattr__ __setattr__ __delattr__ 及点语法原理 __getattr__ 用 .访问属性时,如果属性不存在...,同时调用对应处理函数,当我们需要自定义对象比较规则时,就可以子类覆盖大于等于等方法 案例 # 自定义对象比较 # 对象直接无法直接比较大小 class Person: def

    67040

    3.Python3扩展知识之笔试操作总结(三)

    它总会被绑定在其归属上,同时它第一个参数是本身(记住:类同样是对象) 抽象方法一个定义,但是可能不会有任何实现。 Java ,这被描述为一个接口方法。 #!...没错啦 Python 无处不对象,到处都是你对象。使用以下方法可以将你模块与 A 对象挂钩。...解释下 MRO 顺序基本就是:避免同一被调用多次前提下,使用广度优先和从左到右原则去寻找需要属性和方法。 继承体系,C3 算法确保同一个只会被搜寻一次。...例子如果一个属性或方法 D 没有被找到,Python 就会搜寻 B ,然后搜索 C,如果都没有找到,会继续搜索 B A,如果还是没有找到,则抛出“AttributeError”异常。...# 直线需有两点构成,因此初始化时需有两个点(Point)对象作为参数 #!

    54130

    Python学习 Day 8 继承 多态 Type isinstance dir __slots__

    继承和多态 OOP程序设计,当我们定义一个class时候,可以从某个现有的class继承,新class称为子类(Subclass),而被继承class称为、父或超(Base class...也可以把父不适合方法覆盖重写;有了继承,才能有多态。...调用实例方法时候,尽量把变量视作父类型,这样,所有子类类型都可以正常被接收; 使用type() 判断对象类型,使用type()函数: >>> type(123)#基本类型都可以用type()判断...Python,如果你调用len()函数试图获取一个对象长度,实际上,len()函数内部,它自动去调用该对象__len__()方法,所以,下面的代码是等价: >>> len('ABC') 3.... >>> g = GraduateStudent() >>> g.score = 9999 除非在子类也定义__slots__,这样,子类允许定义属性就是自身__slots__加上父__slots

    89330

    Python3笔试实际操作基础3.md

    它总会被绑定在其归属上,同时它第一个参数是本身(记住:类同样是对象) 抽象方法一个定义,但是可能不会有任何实现。 Java ,这被描述为一个接口方法。 #!...没错啦 Python 无处不对象,到处都是你对象。使用以下方法可以将你模块与 A 对象挂钩。...解释下 MRO 顺序基本就是:避免同一被调用多次前提下,使用广度优先和从左到右原则去寻找需要属性和方法。 继承体系,C3 算法确保同一个只会被搜寻一次。...例子如果一个属性或方法 D 没有被找到,Python 就会搜寻 B ,然后搜索 C,如果都没有找到,会继续搜索 B A,如果还是没有找到,则抛出“AttributeError”异常。...# 直线需有两点构成,因此初始化时需有两个点(Point)对象作为参数 #!

    85620
    领券