1. __item__

class X:
def __init__(self, data=None):
self.data = data or [] # 同样可用于 dict def __setitem__(self, index, value): # 改变值
if index >= len(self.data): # 赋值是给定索引超出范围,则在列表后添加value
self.data.append(value)
return
self.data[index] = value def __getitem__(self, index): # 获取值
return self.data[index] def __delitem__(self, index): # 删除值
return self.data.pop(index) x = X([1,2,3,4])
print(x[3]) # 调用 __getitem__
x[3] = 30 # 调用 __setitem__
print(x.data)
x[30] = 300 # 调用 __setitem__
print(x.data)
del x[3]
print(x.data) >>>
4
[1, 2, 3, 30]
[1, 2, 3, 30, 300]
[1, 2, 3, 300]

2. __call__ 使类像方法一样被调用

class X:
def __init__(self):
self.count = 0 def __call__(self, name):
print(name) def test(f):
f('abc')
test(X())

3.__dir__可控制内置dir函数的返回值

class X:
def __init__(self):
self.count = 0 def __dir__(self):
return [m for m in vars(self).keys() if not m.startswith('__')] # 处理dir(self)的数据 x = X() # 仅对实例有效
print(dir(x))

4.__setattr__

class X:
a = 1 def __getattr__(self, item): # 当前路径都找不到目标时触发
print(f"it's getattr: {item}")
return self.__dict__.get(item) def __setattr__(self, key, value): # 拦截对任何属性的赋值操作
print(f"it's setattr: {key}:{value}")
self.__dict__[key] = value def __delattr__(self, item): # 拦截对任何属性的删除操作
print(f"it's delattr: {item}")
self.__dict__.pop(item) x = X()
print(x.a) # 存在a
print(x.aabb) # 不存在aabb
print(x.__dict__)
x.a = 100 # 修改存在的a属性
x.bbcc = 100 # 修改不存在的bbcc属性
print(x.__dict__)
del x.a # 删除存在的a属性
print(x.__dict__) >>>
1
it's getattr: aabb
None
{}
it's setattr: a:100
it's setattr: bbcc:100
{'a': 100, 'bbcc': 100}
it's delattr: a
{'bbcc': 100}

4.1 __getattribute__拦截任何实例属性的访问

python-运算符重载的更多相关文章

  1. python运算符重载

    python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...

  2. python运算符重载(二)

    一.基础知识 定义:当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们 特性: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有Python ...

  3. Python 运算符重载

    https://www.cnblogs.com/hotbaby/p/4913363.html

  4. python 的重载

    python 的重载主要包括方法重载和运算符重载.1.python 方法重载: 其他的语言一般对于方法重载的话,主要是根据参数的类型不同或者是数量不同来区分同名的方法.而python则比较特殊,它本身 ...

  5. python类可以截获Python运算符

    类可以截获Python运算符 现在,让我们来看类和模块的第三个主要差别: 运算符重载.简而言之,运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法.切片.打印和点号运算等.这只是自 ...

  6. Python 正确重载运算符

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 有些事情让我不安,比如运算符重载.我决定不支持运算符重载,这完全是个人 ...

  7. Python全栈工程师(异常(高级)、运算符重载)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr ...

  8. [b0018] python 归纳 (四)_运算符重载

    # -*- coding: UTF-8 -*- """ 测试运算符重载 加法 总结: python 运算符表达式其实都是调用 类中方法 __xxx__ + <--- ...

  9. Python 中的运算符重载

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...

  10. python学习笔记(五)——静态方法、类方法、运算符重载

    我们都知道类名是不能够直接调用类方法的.在C++中,把成员方法声明为 static 静态方法后可以通过类名调用.同样的在python中也可以通过定义静态方法的方式让类名直接调用. 静态方法 使用 @s ...

随机推荐

  1. 由于未能创建Visual C# 2015编译器,因此未能打开项目xxx。请重新安装Visual Studio。

    解决方案1: 清除如下文件夹里的内容. %AppData%\Local\microsoft\VisualStudio\14.0\ComponentModelCache or  C:\Users\DEL ...

  2. TCP:WireShark分析,序列号Seq和确认号Ack

    转载自 http://blog.csdn.net/a19881029/article/details/38091243 序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数,SYN标志位 ...

  3. bzoj5017: [Snoi2017]炸弹

    Description 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足:  Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被 ...

  4. 51nod 1132 覆盖数字的数量 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1132 题意是给定a,b,l,r求[l,r]内有几个整数可以表示成ax+b ...

  5. vc++使用IWinHttpRequest获取网页内容乱码

    mfc项目的字符集为unicode字符集 乱码前代码: CString rspStr = pHttpReq->ResponseText; MessageBox(rspStr); 乱码效果: 解决 ...

  6. sql server 2008 R2 备份还原到sql 2012

    从sql server 2008 r2备份的在sql server 2012中还原时一直读不到备份文件,然后把2008r2备份文件放到sql 2012的安装路径对应的Backup文件夹后可以读到了,不 ...

  7. PAT 乙级 1041 考试座位号(15) C++版

    1041. 考试座位号(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 每个PAT考生在参加考试时都会被分 ...

  8. slot内容分发

    vue实现了一套内容分发的API,这套API基于当前的web components规范草案,将<slot>元素作为承载分发内容的出口. 在前面的父子组件中,我们提到过,在vue中,组件实例 ...

  9. Python 解析XML实例(xml.sax)

    已知movies.xml <collection shelf="New Arrivals"> <movie title="Enemy Behind&qu ...

  10. [UE4]根据名字调用函数(蓝图)

    一.Set Timer by Function Name 二.Set Timer by Event