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. Python 高级

     GIL面试题如下 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. Guido的声明:ht ...

  2. Educational Codeforces Round 75 (Rated for Div. 2) C. Minimize The Integer

    链接: https://codeforces.com/contest/1251/problem/C 题意: You are given a huge integer a consisting of n ...

  3. Jquery tabs

    官网 http://api.jqueryui.com/tabs/ 必须通过了后台验证tab1的信息后才允许进入tab2 var passed=false;          $("#tabs ...

  4. luogu 4587

    假设当前已经组合好了 $[1, x]$ ,设 $ans = x + 1$ :显然初始时 $x = 0, ans = 1$ 我们另 $y = \sum_{i = l} ^ {r} (w_i <= ...

  5. ubuntu ukylin wineqq 登录时提示:您的号码暂时不能使用低版本的qq

    ubuntu ukylin wineqq 登录时提示:您的号码暂时不能使用低版本的qq,而有的qq号登录没有问题. 优麒麟官网上下载的qqwine安装包,解压后安装三个deb包. 郁闷了一下午,都想装 ...

  6. Python3 内置http.client,urllib.request及三方库requests发送请求对比

    如有任何学习问题,可以添加作者微信:lockingfree 更多学习资料请加QQ群: 822601020获取 HTTP,GET请求,无参 GET http://httpbin.org/get Pyth ...

  7. (转)shell调试方法

    ---恢复内容开始--- 转载:https://www.ibm.com/developerworks/cn/linux/l-cn-shell-debug/ Shell脚本调试技术 曹 羽中2007 年 ...

  8. mybatis xml中是sql语句报错: Error creating document instance. Cause: org.xml.sax.SAXParseException: The

    最近项目折腾了老半天,找了资料才知道是这么回事... 因为语句中有一个小于号“<”,在XML中,会被当成一个页面元素来解析,不会处理为mysql的SQL语句的组成部分,修改如下: 1.在xml的 ...

  9. 页面tr和td的的隐藏与显示

    <view:qrytr attributes="class=zcrzs"> </view:qrytr>     var bd11 = $("tr[ ...

  10. 深入了解JVM虚拟机8:Java的编译期优化与运行期优化

    java编译期优化 java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程:1.前端编译:把.java文件转变为.class文件2.后端编译:把字节码转变为机器码3.静态提前编译: ...