首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python中反射和描述器总结

    __()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性。...__dict__-->继承的祖先类(直到object)的__dict__---找不到--> 调用__getattr__() __setattr__() 可以拦截对实例属性的增加、修改操作,如果要设置生效...值将作为属性查找的结果 如果抛出AttributeError异常,则会直接调用__gutattr__方法,因为表述属性没有找到。...__grtattribute__方法中为了避免在该方法中无限的递归,他的实现应该永远调用基类的同名方法以访问需要的任何属性,例如:object.__getattribute__(self,name)。...一般不使用该方法 魔术方法 __getattr__() 当通过搜索实例、实例的类及祖先类查不到属性,就会调用此方法 __setattr__() 通过.访问实例的属性,进行增加,修改都要调用它 __delattr

    1.1K20

    Python Magic Method 与 Setup 方法:深入解析与应用

    如果类没有定义 __str__ 方法,Python 会试图把调用 __repr__ 的字符串结果返回给用户。...如果类没有定义 __str__ 方法,Python 会试图把调用 __repr__ 的字符串结果返回给用户。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。但要注意实现 __setattr__ 时要避免 “无限递归” 的错误,正确的写法应该是 self....__delattr__(self, name) 与 __setattr__ 很像,只是它定义的是你删除属性时的行为。实现 __delattr__ 是同时要避免 “无限递归” 的错误。...然后,在命令行中进入软件包的根目录,并执行以下命令: pip install . 这将根据 setup.py 文件中的配置信息安装软件包及其依赖库。

    22211

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

    __getattr__ 这个方法只有在用户访问的类属性不存在时才会被调用,通常,你可以在实现的 __getattr__ 中做兜底操作或抛出异常,也可以结合 __setattr__ 方法实现对某个属性的彻底控制...,只要在类外为不存在的属性赋值,改属性就会被创建,而 __getattr__ 只有在属性不存在的情况下才会被调用,此时,如果你需要定义独特的某个属性的行为,或彻底隐藏某个属性,就必须实现 __setattr...__setattr__ 方法会在每一次用户为某个属性赋值时被调用,因此要格外防范无限递归的产生: class TechlogTest: def __init__(self): self.values...__ 一样,__delattr__ 方法的实现也必须格外注意无限递归的产生。...,其实是无需实现 __getattribute__ 方法,事实上,去主动实现 __getattribute__ 方法也是不建议的,因为这太容易造成无限递归。

    76320

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

    无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__时要避免”无限递归”的错误。...__delattr__ 与 __setattr__ 相同,但是功能是删除一个属性而不是设置他们。实现时也要防止无限递归现象发生。...因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免”无限递归”的错误。...在进行属性访问控制定义的时候很可能会很容易引起“无限递归”。...它们反应了关于面向对象程序上一些重要的东西在Python上,并且总的来说Python: 总是一个简单的方法去找某些事情, 即使是没有必要的.

    1.1K70

    Python 中的魔术方法

    构造与初始化 __new__(self): 创建并返回一个类的实例,而__init__只是将传入的参数来初始化该实例,一般不需要重载__new__方法除非希望控制类的创建。...__init__(self): 可以理解为构造函数,将传入的参数初始化成实例 __del__(self): 可以理解为析构函数 属性访问控制 Python缺少对于类的封装,但人们希望Python能够定义私有属性...Python其实可以通过魔术方法来实现封装。 __getattr__(self, name): 该方法定义了你试图访问一个不存在的属性时的行为。...不管对象的某个属性是否存在,它都允许你为该属性进行赋值,因此你可以为属性的值进行自定义操作。有一点需要注意,实现__setattr__时要避免”无限递归”的错误。...def __setattr__(self, name, value): self.name = value # 每一次属性赋值时, __setattr__都会被调用,因此不断调用自身导致无限递归了

    76720

    Python魔术方法-Magic Method

    无论属性是否存在,它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__时要避免"无限递归"的错误。...__delattr__: 与 __setattr__ 相同,但是功能是删除一个属性而不是设置他们。实现时也要防止无限递归现象发生。...因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用 __getattribute__。__getattribute__同样要避免"无限递归"的错误。...在进行属性访问控制定义的时候很可能会很容易引起“无限递归”。...它们反应了关于面向对象程序上一些重要的东西在Python上,并且总的来说Python: 总是一个简单的方法去找某些事情, 即使是没有必要的.

    96160

    Python中getattr、__get__、__getattr__和__getattribute__的区别

    getattr getattr (object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性。...__getattr__(self, name)是一个对象方法,如果找不到对象的属性时会调用这个方法。 这个方法应该返回属性值或者抛出AttributeError异常。...注意,如果通过正常机制能找到对象属性的话,不会调用__getattr__方法。 示例 >>> class Frob: ......如果类还同时定义了__getattr__()方法,则不会调用__getattr__()方法,除非在__getattribute__()方法中显示调用__getattr__()或者抛出了AttributeError...该方法应该返回属性值或者抛出AttributeError异常。 为了避免在方法中出现无限递归的情况,应该总是使用基类的方法来获取属性: >>> object.

    7.4K21

    Python中5对必知的魔法方法

    在Python中,我们不需要对每个属性使用这些访问控制技术。但是,我们可以通过实现__getattr__ 和 __setattr__方法来实现某种控制。...具体地说,当访问实例对象的属性时,调用__getattr__ 方法;而在设置实例对象的属性时,调用__setattr__ 方法。 >>> class Product: ......否则,它将陷入无限递归。 设置formatted_name属性后,该属性将成为 __dict__对象的一部分,因此不会调用__getattr__。...它类似于__getattr__,但每次访问属性时都会调用它。在这一点上,它类似于__setattr__。...同样,你应该使用super()来实现__getattribute__方法,以避免无限递归的错误。 结论 在本文中,回顾了五对重要的特殊方法。通过这些方法,我们了解了与之相关的五个Python概念。

    62120

    Python面向对象编程Day 26部分

    多态是继承的改变和扩展的实现机制,即调用不同的类实例化得对象下的相同方法,实现的过程不一样。 (python中的标准类型就是多态概念的一个良好示范) 封装 本质是要明确的区分内外。...四个可以实现自省的函数(适用于类和对象):     hasattr(object,name,default=None)判断object中有没有一个name字符串对应的方法或属性,没有打印False     ...t文件下的test1函数   双下划线开头(内置方法)的attr方法   属性不存在时触发__getattr__函数(最重要,用的比较多)   删除一个对象的属性时会触发__delattr__函数   ...__setattr__(self,key,value)设置时触发  函数内self.key=value这样会触发无限递归  应该这样设置self....__dict__[key]=value操作底层字典(del 什么.什么也会导致无限递归)  最后执行设属性操作可通过 f=函数名(参数)  f.key=value这样设定   print(函数名.

    47730

    Python知识点笔记-面向对象进阶篇

    python知识点范围:magic method魔术方法 magic method魔术方法是前后有两个下划线的属性; 创建对象的方法def __new__(cls ),重写的话可能需要一个星号和两个星号的参数...; 销毁对象用__del__(),由python回收机制调用; 对象之所以可以比较是因为有运算符魔术方法属性,只要能比较的都有的; 比较运算符__cmp__(self, other)【eq, lt, gt...,用__repr__这个魔术方法来转化; __str__, __unicode__方法也是返回字符串的,str是直接打印对象时调用的; __dir__可以控制调用dir()时要返回的内容; 大部分的内建方法都是有对应魔术方法的...,我们自己可以多多总结; __setattr__每次设置时都会调用; __getattr__, getattribute__查询魔术方法,每次没访问到和访问时会调用; 设置和查询魔术方法要防止无限递归,...容易出错; 递归1万次会报错; python本身没有访问控制,加了双下划线实际只是改了名字,我们仍然可以访问到; __delattr__删除时会访问到; python2里什么都不继承算是老式类,缺少一些功能

    36510

    Python 中几种属性访问的区别

    图 | 《借东西的小人阿莉埃蒂》剧照 起步 python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__。...若查找链都获取不到属性,则抛出 AttributeError 异常。 一、__getattr__ 方法 这个方法是当对象的属性不存在是调用。...如果通过正常的机制能找到对象属性的话,不会调用 __getattr__ 方法。...如果类中还定义了 __getattr__ ,则不会调用 __getattr__()方法,除非在 __getattribute__ 方法中显示调用__getattr__() 或者抛出了 AttributeError...__getattribute__(self, item) 使用基类的方法来获取属性能避免在方法中出现无限递归的情况。 三、__get__ 方法 这个方法比较简单说明,它与前面的关系不大。

    2.5K30

    python-__getattr__ 和

    不是data descriptor或者没有该属性则进行第2步。 3、查找实例t的__dict__中是否有at属性,有则返回,没有则到第3步。...3.2 ​ 4.2 返回__dict__['at'] 5、如果实例t的父类中有__getattr__方法,则调用该方法,没有则抛出AttributeError。...,仍然会首先调用getattribute,根据属性查找原则,在实例和类中都没有找到这个属性,于是执行getattr。...回过头来,getattribute会在调用类和实例的属性时无条件调用,所以可以用于权限鉴别、日志记录等操作;而getattr会在属性没有被找到的时候执行,因此可以用来做一些兜底的操作,可见这篇博客 另外注意重写...__getattribute__(),不要使用return self.xxx,否则self相当于又指向了自己,而getattribute会无条件调用,从而进入无限循环。

    47920

    10 Python 基础: 如何定制类,这里有答案

    01 Python 基础:Python入门必看之语法基础 02 Python 基础:列表及字典内置函数&方法内容梳理 03 Python 基础:Python函数及递归函数知识点梳理 04 Python...__getattr__ 正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。...要避免这个错误,除了可以加上一个score属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。..., attr): if attr=='score': return 99 当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__...: 25 只是调用方式要变为: >>> s.age() 25 注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。

    82830

    Python中反射

    __dir__()))  上例通过属性字典__dict__来访问对象的属性,本质上就是利用反射的能力,但是上面的例子中,访问的方式不优雅,Python提供了内置的函数  内建函数意义getattr(object...,name[,default])通过name返回object的属性值,当属性不存在,将属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串...,如果找不到,就会执行__getattr__()方法,如果没有这个方法,就会抛出AttributeError异常标识找不到属性 查找属性顺序为: instance__dict__---->instance.class.dict...异常  它的return值将作为属性查找的结果如果抛出AttributeError异常,则会直接调用__getattr__方法,因为属性没有找到 __getattribute__方法中为了避免在该方法中无线递归...,就会调用此方法setattr()通过.访问实例属性,进行增加、修改都要调用它delattr()当通过实例来删除属性时调用此方法getattribute实例所有的属性都从这个方法开始 属性查找顺序: 实例调用

    1K00

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

    __getattribute__(self,item) #每次通过实例化访问属性都会通过该函数 #如果没有该属性,则访问完该函数后,再会通过__getattr__函数 Jetbrains全家桶1年...的时候显示而已 c = Book() c.name = 'Python'#这里key = name,value= 'Python' c.value1 = 100#凡是对属性进行设置的都会进入__setattr...__()中 print "---------c.name--------" print c.name#动态建立属性name,本身在class中不存在,故才调用__getattr__ print "---...---------c----------- __str__被调用 Python cost : 0 ---------c.Type-------- __getattr__被调用 Type is not found...num属性,返回布尔类型 print getattr(gsa,'num')#也可以用实例gsa print getattr(gsa,'y','获取不到y属性') #getattr(类名,'属性','没有这个属性输出这里

    45920
    领券