__getattr__和__setattr__】的更多相关文章

反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! getattr() 查找getattr(object,name[,default]):使用字符串数据类型获取对象的方法和属性,注意name是字符串,如果存在则返回,不存在则打印出默认值,默认值…
自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room: def __init__(self,name): self.name = name def big_room(self): print('bigroot') def __getattr__(self, item): print('调用一个不存的对象属性时候,执行',item) def __delattr__(self, item): print('删除一个属性时候,执行',…
# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_462966543.shtml #类的专有方法(__getattr__和__setattr__.__delattr__) #__setattr__:通过该方法,给对象添加或修改指定的属性 class Test(): def __init__(self,name,age): self.name=name se…
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __getattr__ 2.2 __setattr__ 1. print( 坑的信息 ) 挖坑时间:2019/04/07 明细 坑的编码 内容 Py023-4 对 __getattr__ 和 __setattr__ 举例 2. 开始填坑 2.1 __getattr__ Python 3.7.3 官方文档 Called when the default attribute access fails with an AttributeE…
代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value): self.__dict__[key] = value def __getattr__(self, name): return "xxx" obj = A() 执行操作的代码: 代码1: print(obj.__dict__) 结果: {} # 空字典 代码2: print(obj.na…
访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__(): 实例的__setattr__().Descriptor的__set__().实例的__dict__: 实例的__delattr__().Descriptor的__delete__().实例的__dict__.…
通常情况下,我们在访问类或者实例对象的时候,会牵扯到一些属性访问的魔法方法,主要包括: ① __getattr__(self, name): 访问不存在的属性时调用 ② __getattribute__(self, name):访问存在的属性时调用(先调用该方法,查看是否存在该属性,若不存在,接着去调用①) ③ __setattr__(self, name, value):设置实例对象的一个新的属性时调用 ④ __delattr__(self, name):删除一个实例对象的属性时调用 为了验证…
__getattribute__ 官方文档中描述如下: 该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类).因此常用于实现一些访问某属性时执行一段代码的特性. 需要注意的是,正式由于它拦截对所有属性的访问(包括对__dict__的访问),在使用中要十分小心地避开无限循环的陷阱.在__getattribute__方法中访问当前实例的属性时,唯一安全的方式是使用基类(超类) 的方法__getattribute__(使用super).例如: 通过上图中的代码示例可…
getattr 拦截运算(obj.xx),对没有定义的属性名和实例,会用属性名作为字符串调用这个方法 class F(object): def __init__(self): self.name = 'A' def __getattr__(self, item): if item == 'age': return 40 else: raise AttributeError('没有这个属性') f = F() print(f.age) setattr 拦截 属性的的赋值语句 (obj.xx = x…
1.__getattr__ 当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性.而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异常抛出的地方提示出错再适合不过了. 看例子,我们找一个存在的属性和不存在的属性. class A(object): def __init__(self, value): self.value = value   def __getattr__(self, item): print "into __g…
python class 通过内置成员dict 存储成员信息(字典) 首先用一个简单的例子看一下dict 的用法 class A(): def __init__(self,a,b): self.a = a self.b = b def f(self): print (self.__dict__) a = A(1,2) a.f() 输出结果:{‘b’: 2, ‘a’: 1} 我们可以通过重载getattr和setattr来拦截对成员的访问或者作出一些自己希望的行为getattr 在访问对象访问类中…
Python class 通过内置成员__dict__ 存储成员信息(字典) 首先用一个简单的例子看一下__dict__ 的用法 class A(): def __init__(self,ax,bx): self.a = ax self.b = bx def f(self): print (self.__dict__) a = A(1,2) a.f() 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 输出结果:{‘b’: 2, ‘a’: 1} 利用__dict__ 可以达到一些简…
# coding:utf-8 """ __setattr__(self, name, value),如果要给name赋值,调用此方法 __getattr__(self, name) 如果name被访问,同时它不存在的时候,此方法被调用 __getattribute__(self, name) 当name被访问时自动被调用(这个进用于新类式),无论name是否存在,都要被调用 __delattr__(self, name) 如果要删除name,这个方法就被调用 "&q…
__getattr__和__setattr__捕捉属性的一个引用 __getattr__方法是拦截属性点号运算.更确切地说,当通过对未定义(不存在)属性名称和实例进行点号运算时,就会用属性名称为字符串调用这个方祛.如果Python可通过其继承树搜索流程找到这个属性,该方法就不会被调用.因为有这种情况,__getattr__可以作为钩子来通过通用的方式响应属性请求.例子如下. #!/usr/bin/env python # -*- coding:utf-8 -*- class empty: def…
一. 引言 前面几节分别介绍了Python中属性操作捕获的三剑客:__ getattribute__方法.__setattr__方法.__delattr__方法,为什么__ getattribute__方法与后两者的命名规则会不同呢?为什么属性读取的方法不是__ getattr__方法呢?这是因为Python中__ getattr__方法别有用途. 二. __getattr__与__getattribute__关系 __getattr__是Python中的内置函数,该函数可以在实例的属性查看时出…
@property装饰器其实有点无聊,单独拿出来作为一个知识点其实没必要,尽管它可以将方法变成属性,让get和set方法更好用,但是,它破坏了python的简洁(不是代码的简洁而是指语法上). 下面来说明为什么我会这么说. 首先,看一个使用property. class Student(object): @property def testname(self): return self.name @testname.setter def testname(self,name): self.nam…
来自<python学习手册第四版>第六部分 五.运算符重载(29章) 这部分深入介绍更多的细节并看一些常用的重载方法,虽然不会展示每种可用的运算符重载方法,但是这里给出的代码也足够覆盖python这一类功能的所有可能性.运算符重载只是意味着在类方法中拦截内置的操作,当类的实例出现在内置操作中,python自动调用我们自己的方法,并且返回值变成了相应操作的结果:a.运算符重载让类拦截常规的Python运算:b.类可以重载所有Python表达式运算符:c.类也可重载打印.函数调用.属性点号运算等内…
Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).property内置函数(有时又称“特性”)和描述符协议 (descriptor). 在Python中,类和类实例都可以有属性:Python中类的属性相当于C++中类的静态成员,而类实例的属性相当于C++中类的非静态成员.可以简单地这么理解. 1 操作符重载 在Python中,重载__getattr_…
Inside Flask - globals 全局变量(对象代理) 框架是一个容器,在框架内编程,一般是要遵守框架的约定和使用模式.通常这样的模式是 IoC,即由框架调用用户的代码,而不是用户调用框架.框架需要记录当前的状态,并提供给用户代码使用.常用的 Jsp Servelet .ASP.net 等,将请求和状态封装为向用户代码提供的 request .session 等对象.在 flask 中,完成这些工作的是上下文 ctx (context) 和 globals 的全局对象. flask/…
在数据库设计完成之后, 常常需要在 wiki 或其他文档中保存一份数据库中所有表的 desc 描述, 尤其是每个字段的含义和用途. 手动去生成自然是不可取的. 因此, 我编写了一个简单的 python 程序,可以自动生成数据库中所有表的 desc 描述, 并以可读格式输出. # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------- # Name…
对象,价值观和类型 对象 Python的抽象的数据. 所有的数据在一个Python程序 表示对象或对象之间的关系. (在某种意义上,在 符合冯诺依曼模型的代码也“存储程序计算机” 由对象.) 每一个对象都有一个身份,一个类型和一个值. 一个对象的 身份 从来没有 改变一旦被创建,你可能认为这是对象的地址 内存. “ 是 “运营商比较两个对象的身份, id() 函数返回一个整数代表其身份(目前 实现为其地址). 一个对象的 类型 也是不变的. [1] 一个对象的类型决定了操作对象支持(如. :“…
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第九波:第9章  魔法方法.属性和迭代器  在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.已经出现过一些这样的名称(比如__future__),这种拼写表示名字有特殊含义,所有绝不要在自己的程序中使用这种名字. 在Python中,由这些名字组成的集合所包含的方法称为魔法方法(或称特殊方法).如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被Python调用,而几乎没有直接调用…
Python天天美味(25) - 深入理解yield - CoderZh - 博客园 Python天天美味(25) - 深入理解yield   yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法.只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: 取出alist的每一项,然后把i + 1塞进去.然后通过调用取出每一项: 表达式(yield 5)的返回值将赋值给m,所以,认为 m = 5 是错误的.那么如何获取(yield 5)…
在python中,有的名称会在前面和后面加上两个下划线,由这些名字组成的集合所包含的方法称为魔法方法(或者是特殊方法).如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下(确切地说是根据名字)被python调用.而几乎没有直接调用它们的必要. 这里会详细讨论一些重要的魔法方法(最重要的是__init__方法和一些处理对象访问的方法,这些方法允许你创建自己的序列或者是映射),还会处理属性(通过property函数来处理). 一. 构造方法 1.1 介绍与创建 首先要讨论的第一个魔法方法…
这一年一直在用云笔记,平时记录一些tips或者问题很方便,所以也就不再用博客进行记录,还是想把最近学习到的一些东西和大家作以分享,也能够对自己做一个总结.工作中主要基于django框架,进行项目的开发,我是主要做后台相关比较多一些,熟悉django的同学知道,django的后台进程通常通过下面这种方式运行: python manage.py app [options] 我们假设当前的项目名为myproject,这里app表示要运行的app名称,具体为django项目中module/managem…
前面在介绍了类的很多内置方法,比如__add__,__eq__,这里继续介绍类的两个内置方法,这2个内置方法可以将一个类实例变成一个序列的形式.代码如下 class vector(object):     def __init__(self,components):         self._components=components         print self._components     def __len__(self):         return len(self._c…
本文关注的主要是python陷阱,具体而言,是指CPython,而且除非特别说明,所有代码示例都是在python2.7运行的. 我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式.如果一段代码直接出错,抛出了异常,我不认为这是陷阱.比如,Python程序员应该都遇到过的“UnboundLocalError", 示例: >>> a=1 >>> def func(): ...     a+=1 ...     print a ... &g…
[继承示意图] 类是实例的工厂, OOP就是在树中搜索属性,类事实上就是变量名与函数打成的包 . 每一个class语句会生成一个新的类对象 . 每次类调用时,就会生成一个新的实例对象 . 实例自己主动连接到创建这些实例的类 . 类连接到超类的方式是,将超类列在类头部(),其从左到右的顺序会决定树中的次序 有几点须要注意: . 属性一般是在class语句中通过赋值语句加入在类中,而不是嵌入函数的def语句中 . 属性一般是在类中,对传给函数的特殊參数self.做赋值运算而加入在实例中的 [方法调用…
1. 多态 多态,最浅显的意识就是同一事物具有多种形态,这很好理解,动物是一个大类,猫类属于动物类,狗类属于动物类,人也是属于动物类,那能理解成,猫.狗.人是一样的吗?当然不是,还有,水,分为液体.固体.气体,但它们都是H20构成的,这也是多态.意味着对于不同的类的对象,可以执行相同的操作, 多态是面向对象语言的一个基本特性,多态就意味着变量不需要知道引用的对象是什么,通过一个统一的接口,对引入的不同对象表现出不同的行为方式. 下面这个例子 import abc class Animal(met…
python 学习笔记 运算符重载 PYTHON-进阶-魔术方法小结(方法运算符重载) python有着像C++相似的运算符重载,只需要在类中重写__add__.sub 等方法,就可以直接对对象进行 + - 等操作,就好像内置对象一样.也可以重写__getattr__.__setattr__等方法来操作属性,init.del.str .__len__等基本方法都可以重载,比较符的重载包括cmp.lt.__gt__等,以及getitem.__setitem__等操作索引的方法.总之,完全可以通过重…