python-运算符重载
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-运算符重载的更多相关文章
- python运算符重载
python运算符重载就是在解释器使用对象内置操作前,拦截该操作,使用自己写的重载方法. 重载方法:__init__为构造函数,__sub__为减法表达式 class Number: def __in ...
- python运算符重载(二)
一.基础知识 定义:当类中提供了某个特殊名称的方法,在该类的实例出现在它们相关的表达式时,Python自动调用它们 特性: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有Python ...
- Python 运算符重载
https://www.cnblogs.com/hotbaby/p/4913363.html
- python 的重载
python 的重载主要包括方法重载和运算符重载.1.python 方法重载: 其他的语言一般对于方法重载的话,主要是根据参数的类型不同或者是数量不同来区分同名的方法.而python则比较特殊,它本身 ...
- python类可以截获Python运算符
类可以截获Python运算符 现在,让我们来看类和模块的第三个主要差别: 运算符重载.简而言之,运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法.切片.打印和点号运算等.这只是自 ...
- Python 正确重载运算符
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 有些事情让我不安,比如运算符重载.我决定不支持运算符重载,这完全是个人 ...
- Python全栈工程师(异常(高级)、运算符重载)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr ...
- [b0018] python 归纳 (四)_运算符重载
# -*- coding: UTF-8 -*- """ 测试运算符重载 加法 总结: python 运算符表达式其实都是调用 类中方法 __xxx__ + <--- ...
- Python 中的运算符重载
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 一种运算符对于不同类型的对象,有不同的使用方式.例如, + 用于整型对象,表示两个数相加:用于字符串 ...
- python学习笔记(五)——静态方法、类方法、运算符重载
我们都知道类名是不能够直接调用类方法的.在C++中,把成员方法声明为 static 静态方法后可以通过类名调用.同样的在python中也可以通过定义静态方法的方式让类名直接调用. 静态方法 使用 @s ...
随机推荐
- NLP自然语言处理中的hanlp分词实例
本篇分享的依然是关于hanlp的分词使用,文章内容分享自 gladosAI 的博客,本篇文章中提出了一个问题,hanlp分词影响了实验判断结果.为何会如此,不妨一起学习一下 gladosAI 的这篇文 ...
- 基于Elasticsearch的智能客服机器人
本次分享主要会介绍一下ES是如何帮我们完成NLP的任务的.在做NLP相关任务的时候,ES的相似度算法并不足以支撑用户的搜索,需要使用一些与语义相关的方法进行改进.但是ES的很多特性对我们优化搜索体验是 ...
- iphone越狱安装python2.7
cydia 添加源地址:http://apt.so/whitefur 选择python 进行安装 打开ssh连接后输入python 显示python2.7.3 安装成功
- JAVA开源B2C系统
前言 最近有人想面向境外销售商品,但是又不想依托于亚马逊这些平台,于是找我来帮忙想弄个B2C系统.因为刚开始只是打算试试水,也就不打算投入多少成本了.所以这边就考虑使用开源的B2C系统来直接使用了. ...
- Paramiko&堡垒机
Paramiko paramiko模块,基于SSH用于连接远程服务器并执行相关操作. 一.安装 pip install paramiko 二.使用 SSHClient 用于连接远程服务器并执行基本命令 ...
- Hadoop概念学习系列之谈hadoop/spark里为什么都有,键值对呢?(四十)
很少有人会这样来自问自己?只知道,以键值对的形式处理数据并输出结果,而没有解释为什么要以键值对的形式进行. 包括hadoop的mapreduce里的键值对,spark里的rdd里的map等. 这是为什 ...
- [转载]领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- Concurrent包详解及使用场景
Concurrent包是jdk1.5所提供的一个针对高并发进行编程的包. 1.阻塞式队列 - BlockingQueue 遵循先进先出(FIFO)的原则.阻塞式队列本身使用的时候是需要指定界限的. 在 ...
- 廖雪峰Java3异常处理-2断言和日志-2使用JDK Logging
1.日志 为了取代System.out.println() 可以设置输出样式 可以设置输出级别,禁止某些级别输出 可以被重定向到文件 可以按包名控制日志级别 2.JDK内置Logging 在java. ...
- GO中DEFER的理解--DEFER执行的原理
在golang当中,defer代码块会在函数调用链表中增加一个函数调用.这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用.因此,defer通常用来释放函数内 ...