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

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

    django源码分析 LazySetti

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

    31710

    定制类和黑魔法

    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__用的较多。

    47310

    Python中反射和描述器总结

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

    92720

    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.4K30

    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__方法中为了避免在该方法中无线递归

    87300

    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__中发现该属性,返回。

    40820

    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'].

    2.1K30

    Python 黑魔法之属性拦截

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

    64310

    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

    73040

    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__

    68240

    测试开发进阶(六)

    面向对象编程的三大特征:封装,集成,多态 封装:将数据和方法放在一个类中 继承: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

    37230

    python 动态属性和特性

    使用动态属性转换数据 在 Python 中,数据的属性和处理数据的方法统称属性(attribute)。...__class__ 与 type(obj) 的作用相 同) Python 的某些特殊方法,例如 __getattr__,只在对象的类中寻找,而不在实例中寻找 __dict__ 一个映射,存储对象或类的可写属性...有 __dict__ 属性的对象, 任何时候都能随意设置新属性 如果类有 __slots__ 属性,它的实例可能没有 __dict__ 属性 __slots__ 类可以定义这个这属性,限制实例能有哪些属性...__slots__ 属性 的值是一个字符串组成的元组,指明允许有的属性 如果 __slots__ 中没有 '__dict__',那么该类的实例没有 __dict__ 属性,实例只允许有指定名称的属性...使用点号或内置的 getattr、hasattr 和 setattr 函数存取属性都会 触发下述列表中相应的特殊方法 但是,直接通过实例的 __dict__ 属性读写属性不会触发这些特殊方法,通常会使用这种方式

    54920

    python中类的静态方法和类的类方法

    知识回顾: 上一节中,我们深化学习了类的属性监控,主要使用了三个魔法方法: __getattr__ __setattr__ __delattr__ 与此同时在书写属性设置监控的时候,千万不要忘记写__...dict__方法属性。...设置类的属性 4.通过查看类的属性的值,来看属性监控是否成功 二、类的静态方法 在类中的方法名称前加一个头标记@staticmethod。...三、类的类方法 在类中的方法名称前加一个头标记@classmethod。 类的类方法的调用也不需要进行实例化。 类的类方法是在python中对类的构造方法的一个补充。...五、总结强调 1.掌握类的静态方法 2.掌握类的类方法 3.理解静态方法与类方法的区别 4.掌握属性监控的魔法方法书写的方式,不能漏掉类内部存储的__dict__字典存储。

    3.2K20
    领券