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. 需要序列化的类中没有写serialVersionUID的解决办法

    由于没赋值serialVersionUID 只是警告,不是错误,造成先前没留意设定serialVersionUID,网络两端上线运行一段时间也感觉正常.如果再增减修改field,没赋值好serialV ...

  2. 亚马逊aws 一个实例双网卡-两个弹性ip设置

    一个实例默认只有1个网络接口: 步骤一.创建一个新的网络接口,附加到实例. 步骤二.手动添加路由 增加两个路由表,为后续的双网关做点小准备: vim /etc/iproute2/rt_tables 添 ...

  3. LB+nginx+tomcat7集群模式下的https请求重定向(redirect)后变成http的解决方案

    0. 环境信息 Linux:Linux i-8emt1zr1 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_6 ...

  4. 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl

    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl 1.函数调用它自身,这样就形成了一个循环,一环套一环: from urllib.request ...

  5. golang 指针在struct里的应用

    type aa struct { b *int c string } func main() { var data int = 0 var ip *int /* 声明指针变量 */ ip = & ...

  6. 微信开发-业务域名、JS接口安全域名、网页授权域名

    在微信公众平台上可配置这些域名. 1.业务域名:在微信浏览器中点击文本框,会弹出下面的提示,很不爽,通过配置业务域名可以将该提示去掉 2.JS接口安全域名:分享到朋友圈(js-sdk)时用上,此接口要 ...

  7. window7环境MySql5.7 zip安装配置教程

    1.将zip压缩包解压到一个目录下,并改名为mysql5.7 我的是放在D:\web\mysql5.7下 2.修改my-default.ini文件 下面几项是必填的,否则无法启动 basedir = ...

  8. bzoj4941: [Ynoi2016]镜子里的昆虫

    维护每个位置x的上一个相等的位置pv[x],可以把询问表示成l<=x<=r,pv[x]<l的形式,对一次修改,均摊改变O(1)个pv的取值,因此可以用平衡树预处理出pv的变化,用cd ...

  9. java高并发编程(二)

    马士兵java并发编程的代码,照抄过来,做个记录. 一.分析下面面试题 /** * 曾经的面试题:(淘宝?) * 实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容 ...

  10. PAT 乙级 1051 复数乘法 (15) C++版

    1051. 复数乘法 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 复数可以写成(A + Bi)的常规 ...