python面向对象内置方法关于属性篇
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面向对象内置方法关于属性篇的更多相关文章
- python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)
面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...
- day34 反射、面向对象内置方法:如__str__、面向对象的软件开发
Python之路,Day21 = 反射.面向对象内置方法:如__str__.面向对象的软件开发 几个内置查看的方法使用 .__base__ 查看类的继承结构.mro() 对象找属性的顺序存在里面 -- ...
- python字符串内置方法
网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__', ' ...
- python 字典内置方法get应用
python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...
- Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod
Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...
- 6.python字符串-内置方法列举
所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...
- Python的内置方法
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...
- Python 面向对象 - 内置类方法
内置方法 内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对象,在对象被删除之前调用 __new__(cls,*ar ...
- python黑魔法 -- 内置方法使用
很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...
随机推荐
- "=="和equals小结
通俗点讲,==是看看左右是不是一个东西.equals是看看左右是不是长得一样.如何记住嘛.如果单纯是想记住, ==:等于.equals:相同.两个长得一样的人,只能说长的相同(equals),但是不 ...
- celery 笔记
参考:https://blog.csdn.net/tichimi3375/article/details/82415412 中文翻译:https://www.celerycn.io/ htt ...
- Nginx反爬虫: 禁止某些User Agent抓取网站
问题 之前客户能够正常访问的一个网站这几天访问很慢,甚至有时候还拒绝访问.通过Nginx访问日志排查,发现有大量的请求指向同一个页面,而且访问的客户端IP地址在不断变化且没有太多规律,很难通过限制IP ...
- 使用Costura.Fody插件将自己写的程序打包成一个可以独立运行的EXE文件
我们在开发程序的时候会引用很多DLL文件,在程序完成编写后,如果不把这些引用的DLL打包,不能在其他电脑运行,那么很多同学可能在想了,能不能把我们编写好的程序打包成一个EXE文件,最好双击就能运行,当 ...
- MySQL Multi-Range Read(MRR 索引多范围查找) 原理与解析
原理: 如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问.使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只 ...
- 004_Python3 注释
确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释:Python中单行注释以 # 开头,例如::# 这是一个注释print("Hello, Worl ...
- luogu 3200 [HNOI2009]有趣的数列 卡特兰数+质因数分解
打个表发现我们要求的就是卡特兰数的第 n 项,即 $\frac{C_{2n}^{n}}{n+1}$. 对组合数的阶乘展开,然后暴力分解质因子并开桶统计一下即可. code: #include < ...
- PHP全栈学习笔记20
thinkphp概述,thinkphp项目构建流程,thinkphp项目结构,thinkphp配置,thinkphp控制器,thinkphp模型,thinkphp视图,thinkphp的内置模板引擎. ...
- eclipse 点击 new window 后,关闭新增的窗口
点击右上角的 X 关闭,不要点击 exit 退出
- Spring注解不生效
如果在使用spring中,发现注解不生效,检查下如下配置是否配置. 1:一般情况下@Autowired默认是不生效的,配置之后,才会生效 <context:annotation-config / ...