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

在__getattr__中使用__dict__属性

在Python中,__getattr__是一个特殊方法,用于在访问一个不存在的属性时被调用。__dict__是一个字典,用于存储对象的属性和值。

__getattr__中使用__dict__属性可以实现动态属性的获取和设置。当访问一个不存在的属性时,Python会调用__getattr__方法,并将属性名作为参数传递给该方法。我们可以在__getattr__方法中通过访问__dict__属性来获取或设置属性的值。

下面是一个示例代码:

代码语言:txt
复制
class MyClass:
    def __getattr__(self, name):
        if name == 'my_attribute':
            return self.__dict__.get(name, 'default_value')
        else:
            raise AttributeError(f"'MyClass' object has no attribute '{name}'")

obj = MyClass()
print(obj.my_attribute)  # 输出: default_value
obj.my_attribute = 'new_value'
print(obj.my_attribute)  # 输出: new_value

在上面的示例中,当访问my_attribute属性时,__getattr__方法会被调用。如果my_attribute存在于__dict__中,则返回其对应的值;否则返回默认值default_value。当给my_attribute属性赋值时,会将新的值存储在__dict__中。

使用__getattr____dict__属性可以实现一些动态属性的逻辑,例如延迟加载属性、属性的默认值等。

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

  • 腾讯云官网:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 人工智能平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iothub
  • 移动推送服务(信鸽):https://cloud.tencent.com/product/tpns
  • 对象存储(COS):https://cloud.tencent.com/product/cos
  • 区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/virtual-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python深入03 对象的属性

一个对象的属性还可能是该对象实例定义的,叫做对象属性(object attribute)。 对象的属性储存在对象的__dict__属性。__dict__为一个词典,键为属性名,对应的值为属性本身。...使用特殊方法__getattr__ 我们可以用__getattr__(self, name)来查询即时生成的属性。...__getattr__只能用来查询不在__dict__系统属性) __setattr__(self, name, value)和__delattr__(self, name)可用于修改和删除属性。...总结 __dict__分层存储属性。每一层的__dict__只存储该层新增的属性。子类不需要重复存储父类属性。 即时生成属性是值得了解的概念。...Python开发,你有可能使用这种方法来更合理的管理对象的属性

1.2K70
  • python __setattr__, __getattr__,__getattribute__, __call__使用方法

    如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有实例的__dict__或它构造类的__dict__或基类的__dict...__没有找到,才会调用__getattr__。...如下所示,ClassA定义了__getattribute__方法,实例insA获取属性时,都会调用__getattribute__返回结果,即使是访问__dict__属性。...如果类自定义了__setattr__方法,当通过实例获取属性尝试赋值时,就会调用__setattr__。常规的对实例属性赋值,被赋值的属性和值会存入实例属性字典__dict__。...类定义的self.attr也同样,所以__setattr__下还有self.attr的赋值操作就会出现无线递归的调用__setattr__的情况。

    1.3K70

    Python对象的属性访问过程详解

    补充知识:深入理解python对象及属性属性和实例属性 首先来看看类属性和类实例的属性python如何存储,通过__dir__方法来查看对象的属性 class Test(object):...# 方法tree__dict__里面 Spring....默认情况下,python各个实例为名为__dict__的字典里存储实例属性,而字典会消耗大量内存(字典要使用底层散列表提升访问速度), 通过__slots__类属性元组存储实例属性,不用字典,...但是,由于在这里使用了__getattr__(self, name) 方法,当发现 x 不存在于对象的__dict__的时候,就调用了__getattr__,即所谓“拦截成员”。...但是,找 a.lang的时候,不仅实例属性没有,类属性也没有,于是就调用了__getattr__()方法。在上面的类,有这个方法,如果没有__getattr__()方法呢?

    2K20

    django源码分析 LazySetti

    在说LazySetting对象之前,我们先看一下python的类属性的查找方式: 查找一个实例化的类属性的时候 首先查找这个类的实例属性是否存在,存在直接返回 如果类的实例属性不存在,则在类的类属性查找...,类属性存在,则返回 如果类属性也不存在,若定义了__getattr__方法,则根据__getattr__方法获取属性 python属性和实例属性会记录在类的一个内置变量__dict__,类属性和实例属性有各自维护的...__dict__[name] = val return val 我们LazySetting对象查找一个属性的时候,先在实例属性(self....__dict__)查找,没有找到话,通过__getattr__方式获取,获取到后,将属性值保存到实例属性,这样就实现了属性使用的时候 再获取,然后保存。...我们还可以再获取属性之前,先将属性的值自定义,这样就可以不用使用__getattr__的方式来获取默认的值。

    31610

    Python获取对象属性的几种方式小结

    补充知识:深入理解python对象及属性属性和实例属性 首先来看看类属性和类实例的属性python如何存储,通过__dir__方法来查看对象的属性 class Test(object):...# 方法tree__dict__里面 Spring....默认情况下,python各个实例为名为__dict__的字典里存储实例属性,而字典会消耗大量内存(字典要使用底层散列表提升访问速度), 通过__slots__类属性元组存储实例属性,不用字典,...但是,由于在这里使用了__getattr__(self, name) 方法,当发现 x 不存在于对象的__dict__的时候,就调用了__getattr__,即所谓“拦截成员”。...但是,找 a.lang的时候,不仅实例属性没有,类属性也没有,于是就调用了__getattr__()方法。在上面的类,有这个方法,如果没有__getattr__()方法呢?

    3.8K20

    定制类和黑魔法

    2.引子:使用点来访问属性本质上就是访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的是独立的)的内容。     ...使用__slots__一个不好的地方就是我们不能再给实例添加新的属性了,因为实例已经没有了用来保存属性的__dict__字典,只能使用在__slots__定义的那些属性,即类的__slots__定义了哪些属性...__dict__[name] = value ...  >>> a = A() >>> a.x # 属性x不存在,自动调用__getattr____getattr__做处理 You use..., name)方法,当发现属性x不存在于对象的__dict__时,就调用了__getattr__,即属性拦截。   ...__setattr__和__delattr__的定义属于多此一举,不定义这两种方法也是默认执行赋值或删除操作,因此很少使用。__getattr__用的较多。

    46510

    Python反射和描述器总结

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

    92220

    python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用。__dict____dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。...既然__dict__是个字典那么我们就可以用字典的属性了。我们通过使用dir()属性来看看__dict__都有哪些属性。...我们使用给对象的属性赋值的时候:class A(): def __init__(self,dicts): self.name=dicts["name"] self.age...__getattr__使用.获取属性的时候,如果该属性存在就输出其值,如果不存在则会去找_getatrr_,我们可以通过重写该方法可以实现动态属性的操作。...__会在没有查找到相应实例属性时被调用的特点,方便的通过链式调用生成对应的url,碰到get方法的时候调用函数获取其网页源码。

    2.2K30

    Python反射

    简单说,Python,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或自省。...__dir__()))  上例通过属性字典__dict__来访问对象的属性,本质上就是利用反射的能力,但是上面的例子,访问的方式不优雅,Python提供了内置的函数  内建函数意义getattr(object...,name[,default])通过name返回object的属性值,当属性不存在,将属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串...__dict__) print(p1.x)  实例通过.点号设置属性,例如self.x=x,就会代用__setattr__(),属性要加到实例的__dict__,就需要自己完成。...异常  它的return值将作为属性查找的结果如果抛出AttributeError异常,则会直接调用__getattr__方法,因为属性没有找到 __getattribute__方法为了避免该方法无线递归

    86200

    python-__getattr__ 和

    查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上需要理解python属性的查找顺序、描述器(descriptor)、__get__、__set__、__dict...假设 t = T(),t.at的查找顺序如下: 1、如果是python自动产生的属性,返回,否则进行第2步 2、如果‘at’出现在了T或者其父类和祖先类的__dict__(即‘at’是一个类属性,并非只属于...不是data descriptor或者没有该属性则进行第2步。 3、查找实例t的__dict__是否有at属性,有则返回,没有则到第3步。...下面继续使用上方代码验证__getattr__、非描述器的执行顺序。...,‘not_desc’类的__dict__被找到了,但不是descriptor,所以执行第2步,实例的__dict__中发现该属性,返回。

    40520

    Python 几种属性访问的区别

    __dict__['x'] ,再通过 type(a) 的基类开始查找。 若查找链都获取不到属性,则抛出 AttributeError 异常。...如果类还定义了 __getattr__ ,则不会调用 __getattr__()方法,除非在 __getattribute__ 方法显示调用__getattr__() 或者抛出了 AttributeError...__getattribute__(self, item) 使用基类的方法来获取属性能避免方法中出现无限递归的情况。 三、__get__ 方法 这个方法比较简单说明,它与前面的关系不大。...__dict__['x'] = 1 # 不会调用 __get__ a.x # 调用 __get__ 如果查找的属性描述符对象,则这个描述符会覆盖上文说的属性访问机制...__dict__['x'].__get__(a, type(a)) 如果调用的是类属性, A.x 则转换为:A.__dict__['x'].

    2K30

    Python 黑魔法之属性拦截

    本文字数:2075 字 阅读本文大概需要:6 分钟 写在之前 我们昨天的文章(Python 黑魔法之内存优化)讲了一种黑魔法,今天我们来讲另一种:「属性拦截」。...属性拦截 Python ,就有一些具有拦截功能的方法,让我们先来看一下: 1.__setattr__(self,name,value):如果想要给 name 赋值的话,就需要调用这个方法。 2...._getattr__(self,name) 方法,当发现属性 x 不存在于对象的 __dict__ 时,就调用了 __getattr__,也就是所谓的「拦截成员」。...__dict__[name] = value,通过这个就将属性和数据存到了对象 __dict__ 。...至此,不知道你发现了没有,我们使用了很多以双下划线开头和结尾的属性和方法,比如 __init__ 等。

    63510

    Python 类与继承

    使用 @classmethod 装饰器进行修饰,同时需要指定传入第一个参数为 cls(命名可以自定义),调用过程,可以直接通过 类名.方法名 进行调用,也可以实例化后通过 实例名.方法名 进行调用...__dict__ # {'name': 'def', 'age': 20} 从这两个方法的对比,我们也可以看出来,__dict__ 得到的内容只是 dir() 的子集,dir() 包含 __dict_..._ 属性 __getattr__ 与 __getattribute__ https://www.cnblogs.com/huchong/p/9306459.html https://juejin.cn...python 中有许多不需要引用就能直接使用的函数,例如 open 、str、chr 等等,这些函数都包含在内建模块 python2/3 对于内建模块,有不同的表示方法 python2 python2...相同,不再赘述 通用 python2/3 ,都有一个 __builtins__,它是 __builtin__ 和 builtins 的引用,它的好处是直接就可以使用,不需要事先 import dir

    71940

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

    # 使用场景:当你的对象再使用过程打开了不属于解释器的资源,例如文件,网络端口 import time class Person: def __init__(self, name, age...时将导致这个类的对象不再添加__slots__定义之外的属性 __getattr__ __setattr__ __delattr__ 及点语法原理 __getattr__ 用 .访问属性时,如果属性不存在...语法的原理 __getattribute__ 该函数也是用来获取属性 获取属性时如果存在__getattribute__则先执行该函数,如果没有拿到属性则继续调用__getattr__函数,如果拿到了则直接返回...__dict__["name"] = 'jackson' # 通过操作__dict__ 也可以操作属性(....语法的背后就是操作 __dict__) print(b.name) # 这个属性存在,就没有调用 __getattr__ # jackson del b.name # 触发 __delattr__

    66840

    Python object类的特殊方法代码讲解

    __getattribute__方法 1)什么时候被调用 这个特殊方法是我们使用类的对象进行obj.属性名或getattr(obj,属性名)来取对象属性的值的时候被调用。...如果属性存在,则返回该属性的值,如果属性不存在,则返回None。 注意,我们使用hasattr(obj,属性名)来判断某个属性是否存在时,__getattribute__方法也会被调用。...2)与__getattr__的区别 我们类的实现,可以重写__getattr__方法,那么__getattr__方法和__getattribute__方法有什么区别?...而__getattr__属性不存在时调用,默认会抛出 AttributeError: ‘Foo’ object has no attribute ‘age’ 这样的错误,但我们可以对其进行重写,做我们需要的操作...所以,我们可以利用__getattr__做很多事情,例如从类的一个字典取值,或者处理异常等。 2.

    83730

    测试开发进阶(六)

    面向对象编程的三大特征:封装,集成,多态 封装:将数据和方法放在一个类 继承:python的一个类可以继承于一个或多个类,被继承的叫父类(基类,base class),继承的类叫子类 多态:一类事物拥有多种形态...开放封闭原则 对于一个变量,只需要知道它是Base类型,无需确切地知道它的子类型,就可以调用run()方法(调用方只管调用,不管细节) 当需要新增功能,只需要新增一个Base的子类实现run(),就可以原来的基础上进行扩展..._MyClass__attr2) # 3000 使用私有属性优化单例模式 更安全 class MyClass(object): """ MyClass文档注释 """...__slots__) # ['name'] 作用:不再生成__dict__节约内存 自定义属性访问 内置函数: getattr() 获取对象属性 setattr() 给对象设置属性 delattr(...__getattribute__(self, item) def __getattr__(self, item): """如果属性不存在,getattribute报AttributeError

    36930
    领券