1、关于__xxxattr__之__getattr__、__setattr__、__delattr__

2、关于__xxxitem__之__getitem__、__setitem__、__delitem__

起步之attr,(attribute属性),我们可以通过对象来调用属性,如果调用的属性存在,那么我们将会得到这个属性,如果这个属性不存在但是不会报错(前提是我们写了__getattr__方法),将会调用__getattr__方法,与之类似的还有__getattribute__方法,

当我们在类中同时写了__getattr__和__getattribute__方法时,调用属性时将只会执行后者,无论这个属性是否存在都会执行,而__getattr__仅当属性不存在时才会被调用

慢走之__setattr__,这个方法比较神奇,只要属性被赋值便会执行这个方法,当对象实例化时如果其中有属性被赋值便会执行该方法,当为对象添加新属性时也会执行这个方法。通过这个特性,我们可以对添加的属性进行定制,比如只能添加int类型或者str类型的。。。然而这里面有坑。当通过self.key = value方式添加新属性时,将会产生循环调用,导致报错,所以这时我们可以通过操作属性字典的方式进行添加新属性。

完成之__delattr__,前面提到过属性的增删改查,当我们定义过__delattr__方法后,删除属性时将会调用该方法,此处有坑,不能在_delattr__方法内通过del self.item直接删除属性,否则还是会出现循环调用导致报错,多以还是通过操作字典的方式进行操作。


class Foo2(object):
def __init__(self):
self.name = 'ajune' # 通过对象.属性的方式访问属性时才会调用
def __getattr__(self, item):
# 获取的属性不存在时将会调用该方法
print('__getattr__被调用') # 当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,
# 除非__getattribute__在执行过程中抛出异常AttributeError
# def __getattribute__(self, item):
# # 无论属性是否存在都会调用该方法
# print('__getattribute__方法被调用') def __setattr__(self, key, value):
print('__setattr__方法被调用')
# self.__dict__[key] = value
# self.key = value # 产生循环调用,无法设置
# 通过函数的实现,实现对设置的属性进行限定
if type(value) is str:
print('开始设置')
# self.k=v #触发__setattr__
self.__dict__[key] = value.upper()
else:
print('必须是字符串类型') def __delattr__(self, item):
print('__delattr__方法被调用')
# del self.item # 循环调用,报错
self.__dict__.pop(item)

啊啊啊啊啊啊啊啊。开始了__xxxitem__,这些东西就一句话,只用通过字典调用的方式才会执行下列的方法,没错你没听错,字典,这时可以类当做字典了,有没有感到很神奇?


class Fo1(object):
# 通过字典的方式使用属性才会执行
def __setitem__(self, key, value):
print('__setitem__执行')
self.__dict__[key] = value def __getitem__(self, item):
print('__getitem__执行')
return self.__dict__[item] def __delitem__(self, key):
print('__delitem__执行')
self.__dict__.pop(key) fo1 = Fo1()
fo1['name'] = 'ajune'
# print(fo1.name)
print(fo1['name'])
del fo1['name']

python面向对象内置方法关于属性篇的更多相关文章

  1. python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)

    面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  2. day34 反射、面向对象内置方法:如__str__、面向对象的软件开发

    Python之路,Day21 = 反射.面向对象内置方法:如__str__.面向对象的软件开发 几个内置查看的方法使用 .__base__ 查看类的继承结构.mro() 对象找属性的顺序存在里面 -- ...

  3. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__', ' ...

  4. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  5. Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod

    Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...

  6. 6.python字符串-内置方法列举

    所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...

  7. Python的内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  8. Python 面向对象 - 内置类方法

    内置方法  内置方法  说明  __init__(self,...)  初始化对象,在创建新对象时调用  __del__(self)  释放对象,在对象被删除之前调用  __new__(cls,*ar ...

  9. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

随机推荐

  1. 修改git提交的用户名和密码

    目的:每个项目自定义Git提交的用户名和邮箱 1.在本地找到某个项目所在的地址 2.找到config文件 3.增加如下配置 4. ok,这样每个项目都可以定义提交者姓名和邮箱了

  2. Selenium常用API的使用java语言之15-警告框处理

    在 WebDriver中处理JavaScript所生成的alert.confirm以及prompt十分简单,具体做法是使用switch_to_alert()方法定位到alert/confirm/pro ...

  3. Coins in a Line II

    There are n coins with different value in a line. Two players take turns to take one or two coins fr ...

  4. 三十六.MHA集群概述 、 部署MHA集群 测试配置

    1.准备MHA集群环境 准备6台虚拟机,并按照本节规划配置好IP参数 在这些虚拟机之间实现SSH免密登录 在相应节点上安装好MHA相关的软件包   使用6台RHEL 7虚拟机,如图-1所示.准备集群环 ...

  5. bzoj 2563: 阿狸和桃子的游戏 贪心

    这个真的好巧妙啊~ 如果只考虑点权的话显然直接按照权值大小排序即可. 但是加入了边权,就有了一个决策的问题. 于是,我们将边权分一半,分给两个端点. 如果一个人拿了两个端点,则边权都会加上. 否则,边 ...

  6. (3)打鸡儿教你Vue.js

    vue.js是一套构建用户界面的渐进式框架 vue关注视图层,采用自底向上增量开发的设计 <div id="app"> <p>{{ message }}&l ...

  7. 数据结构实验之二叉树一:树的同构 (SDUT 3340)

    题解:把原本结构体的左右子树的类型定义成 int 型,用来存放这个结点的左右子树的编号,分别建造两棵二叉树,按个比较,如果在第二棵树中没有找到,那么就不用在判断了. #include <bits ...

  8. 【原创】go语言学习(二十二)网络编程

    目录 TCP/IP协议介绍 GO快速实现TCP服务端 GO快速实现TCP客户端 UDP协议介绍 UDP编程实例 TCP/IP协议介绍 1.互联网起源 A. 起源于美国五角大楼,它的前身是美国国防部高级 ...

  9. 使用MockMVC与Junit进行单体测试

    1.pom.xml追加 junit spring-test 2.测试共通类 @ContextConfiguration(locations = { "classpath:springfram ...

  10. 30行左右代码实现一个类似httprunner的接口框架

    框架的最终归宿往往是领域语言+模板解析. 首先先约定一种所要执行操作的表述格式.然后通过模板解析将描述语言转化为代码进行执行.例如,我们可以使用以下yaml文件描述多个步骤并且需要关联的接口: api ...