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 ...
随机推荐
- pyhanlp 中文词性标注与分词简介
pyhanlp 中文词性标注与分词简介 pyhanlp实现的分词器有很多,同时pyhanlp获取hanlp中分词器也有两种方式 第一种是直接从封装好的hanlp类中获取,这种获取方式一共可以获取五种分 ...
- Hystrix 使用入门
在很多系统架构中都需要考虑横向扩.单点故障等问题,对于一个庞大的应用集群,部分服务或者机器出现问题不可避免,在出现故障时,如何减少故障的影响.保障集群的高可用,成为一个重要的工作,Hystrix 是一 ...
- ecstore-自定义app里增加对应的wap的模板
注意第二个参数空第三个参数是自定义app名称$this->page('wap/member/recmembers.html','','ecstoreapprcomp2p');
- java小程序(课堂作业06)
编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”.“及格”.“中”.“良”.“优”的结论. 要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都 ...
- WINDOWS 命令行 串口 COM 发送数据
WINDOWS 命令 串口 数据 type con>com1 回车. com1 为想发送的串口. 输入字符并回车即可.
- webGL之three.js入门3--材料篇
这几天在看李鹏程翻译的[美]Jos Dirksen的<Three.js开发指南>,看到第八章了,现在来总结一下threejs中材料的相关知识.顺带也看完了上海交大的张雯莉出的<thr ...
- STL基础--算法(排序)
STL排序算法 排序算法要求随机访问迭代器 vector, deque, container array, native array 例子 vector<int> vec = {9,1,1 ...
- 学习笔记之TensorFlow
TensorFlow https://www.tensorflow.org/ An open source machine learning framework for everyone Tensor ...
- [转][html]radio 获取选中状态
方法一: if ($("#checkbox-id").get(0).checked) { // do something } 方法二: if($('#checkbox-id').i ...
- 在MySQL中实现Rank高级排名函数
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...