1. Python 魔法方法
Python 魔法方法

基础:
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 初始化一个实例 | x = MyClass() |
x.__init__() |
| 作为一个字符串的"官方"表示 | repr(x) |
x.__repr__() |
| 作为一个字符串 | str(x) |
x.__str__() |
| 作为字节数组 | bytes(x) |
x.__bytes__() |
| 作为格式化字符串 | format(x, format_spec) |
x.__format__(format_spec) |
__init__()方法在创建实例后调用.如果你想控制创建过程,请使用__new__()方法- 按照惯例,
__repr__()应该返回一个有效的Python表达式的字符串 __str__()方法也被称为你的print(x)
迭代相关
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 遍历一个序列 | iter(seq) |
seq.__iter__() |
| 从迭代器中获取下一个值 | next(seq) |
seq.__next__() |
| 以相反的顺序创建一个迭代器 | reversed(seq) |
seq.__reversed__() |
__iter__()无论何时创建新的迭代器,都会调用该方法.__next__()每当你从迭代器中检索一下个值的时候,都会调用该方法__reversed__()方法并不常见.它需要一个现有序列并返回一个迭代器,该序列是倒序的顺序.
属性
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 得到一个属性 | x.my_property |
x.__getattribute__('my_property') |
| 获得一个属性 | x.my_property |
x.__getattr__('my_property') |
| 设置一个属性 | x.my_property = value |
x.__setattr__('my_property', value) |
| 阐述一个属性 | del x.my_property |
x.__delattr__('my_property') |
| 列出所有属性和方法 | dir(x) |
x.__dir__() |
- 如果你的类定义了一个
__getattribute__()方法,Python将在每次引用任何属性或方法名时调用它. - 如果你的类定义了一个
__getattr__()方法,Python只会在所有普通地方查找属性后调用它.如果一个实例x定义了一个属性color,x.color将不会调用x.__getattr__('color'); 它将简单地返回已经定义的x.color值. __setattr__()只要你为属性指定值,就会调用该方法.__delattr__()只要删除属性,就会调用该方法.__dir__()如果您定义一个__getattr__()或者__getattribute__()方法,该方法很有用.通常情况下,调用dir(x)只会列出常规属性和方法.
__getattr__()和__getattribute__()方法之间的区别很微妙但很重要.
函数类
通过定义call()方法,您可以创建一个可调用类的实例 - 就像函数可调用一样.
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 来"调用"像函数一样的实例 | my_instance() |
my_instance.__call__() |
行为
如果你的类作为一组值的容器 - 也就是说,如果问你的类是否"包含"一个值是有意义的 - 那么它应该定义下面的特殊方法,使它像一个集合一样.
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 序列的数量 | len(s) |
s.__len__() |
| 否包含特定的值 | x in s |
s.__contains__(s) |
字典(映射)
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 通过它的key来获得值 | x[key] |
x.__getitem__(key) |
| 通过它的key来设置一个值 | x[key] = value |
x.__setitem__(key, value) |
| 删除键值对 | del x[key] |
x.__delitem__(key) |
| 为丢失的key提供默认值 | x[nonexistent_key] |
x.__missing__(nonexistent_key) |
数字
| 如果你想... | 所以,你写... | Python调用... | |
|---|---|---|---|
| 加 | x + y |
x.__add__(y) |
|
| 减 | x - y |
x.__sub__(y) |
|
| 乘 | x * y |
x.__mul__(y) |
|
| 整除 | x / y |
x.__trueiv__(y) |
|
| 除 | x // y |
x.__floordiv__(v) |
|
| 取余 | x % y |
x.__mod__(y) |
|
| 整除与取余 | divmod(x, y) |
x.__divmod__(y) |
|
| 平方 | x ** y |
x.__pow__(y) |
|
| 左移 | x << y |
x.__lshift__(y) |
|
| 友移 | x >> y |
x.__rshift__(y) |
|
| 按位and运算 | x & y |
x.__and__(y) |
|
| 按位xor或运算 | x ^ y |
x.__xor__(y) |
|
| 按位or运算 | `x | y` | x.__or__(y) |
上述一组特殊方法采用第一种方法:给定x / y,它们提供了一种方法让x说"我知道如何用y整除自己".以下一组特殊方法解决了第二种方法:它们为y提供了一种方法来说"我知道如何成为分母,并将自己整除x".
| 如果你想... | 所以,你写... | Python调用... | |
|---|---|---|---|
| 加 | x + y |
x.__radd__(y) |
|
| 减 | x - y |
x.__rsub__(y) |
|
| 乘 | x * y |
x.__rmul__(y) |
|
| 整除 | x / y |
x.__rtrueiv__(y) |
|
| 除 | x // y |
x.__rfloordiv__(v) |
|
| 取余 | x % y |
x.__rmod__(y) |
|
| 整除与取余 | divmod(x, y) |
x.__rdivmod__(y) |
|
| 平方 | x ** y |
x.__rpow__(y) |
|
| 左移 | x << y |
x.__rlshift__(y) |
|
| 友移 | x >> y |
x.__rrshift__(y) |
|
| 按位and运算 | x & y |
x.__rand__(y) |
|
| 按位xor或运算 | x ^ y |
x.__rxor__(y) |
|
| 按位or运算 | `x | y` | x.__ror__(y) |
可是等等!还有更多!如果你正在进行"就地"操作,如x /= 3则可以定义更多特殊的方法.
| 如果你想... | 所以,你写... | Python调用... | |
|---|---|---|---|
| 加 | x + y |
x.__iadd__(y) |
|
| 减 | x - y |
x.__isub__(y) |
|
| 乘 | x * y |
x.__imul__(y) |
|
| 整除 | x / y |
x.__itrueiv__(y) |
|
| 除 | x // y |
x.__ifloordiv__(v) |
|
| 取余 | x % y |
x.__imod__(y) |
|
| 整除与取余 | divmod(x, y) |
x.__idivmod__(y) |
|
| 平方 | x ** y |
x.__ipow__(y) |
|
| 左移 | x << y |
x.__ilshift__(y) |
|
| 友移 | x >> y |
x.__irshift__(y) |
|
| 按位and运算 | x & y |
x.__iand__(y) |
|
| 按位xor或运算 | x ^ y |
x.__ixor__(y) |
|
| 按位or运算 | `x | y` | x.__ior__(y) |
还有一些"单个数"数学运算可以让你自己对类似数字的对象进行数学运算.
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 负数 | -x |
x.__neg__() |
| 正数 | +x |
x.__pos__() |
| 绝对值 | abs(x) |
x.__abs__() |
| 逆 | ~x |
x.__invert__() |
| 复数 | complex(x) |
x.__complex__() |
| 整数 | int(x) |
x.__int__() |
| 浮点数 | float(x) |
x.__float__() |
| 四舍五入到最近的整数 | round(x) |
x.__round__() |
| 四舍五入到最近的n位数 | round(x, n) |
x.__round__(n) |
| 最小整数 | math.ceil(x) |
x.__ceil__() |
| 最大整数 | math.floor(x) |
x.__floor__() |
| 截断x到0的最接近的整数 | math.trunc(x) |
x.__trunc__() |
| 数字作为列表索引 | a_list[x] |
a_list[x.__index__()] |
比较
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 等于 | x == y |
x.__eq__(y) |
| 不等于 | x != y |
x.__ne__(y) |
| 小于 | x < y |
x.__lt__(y) |
| 小于等于 | x <= y |
x.__le__(y) |
| 大于 | x > y |
x.__gt__(y) |
| 大于等于 | x >= y |
x.__ge__(y) |
| 布尔 | if x: |
x.__bool__() |
序列化
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 对象副本 | copy.copy(x) |
x.__copy__() |
| 深拷贝 | copy.deepcopy(x) |
x.__deepcopy__() |
| 序列化一个对象 | pickle.dump(x, file) |
x.__getstate__() |
| 序列化一个对象 | pickle.dump(x, file) |
x.__reduce__() |
| 序列化一个对象 | pickle.dump(x, file, protocol_version) |
x.__reduce_ex__(protocol_version) |
| 取出恢复后的状态 | x = pickle.load(fp) |
x.__getnewargs__() |
| 取出恢复后的状态 | x = pickle.load(fp) |
x.__setstate__() |
with 语句
with块限定了运行时上下文;在执行with语句时,"进入"上下文,并在执行块中的最后一个语句后"退出"上下文.
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 进入with语句块 | with x: |
x.__enter__() |
| 退出with语句块 | with x: |
x.__exit__(exc_type, exc_value, traceback) |
真正深奥的东西
| 如果你想... | 所以,你写... | Python调用... |
|---|---|---|
| 一个类的构造函数 | x = MyClass() |
x.__new__() |
| 一个类的析构函数 | del x |
x.__del__() |
| 只有一组特定的属性需要定义 | `` | x.__solts__() |
| hash码 | hash(x) |
x.__hash__() |
| 获得一个属性的值 | x.color |
type(x).__dict__['color'].__get__(x, type(x)) |
| 设置一个属性的值 | x.color = 'PapayaWhip' |
type(x).__dict__['color'].__set__(x, 'PapayaWhip') |
| 删除一个属性 | del x.color |
type(x).__dict__['color'].__del__(x) |
| 一个对象是否是你的一个类的实例 | isinstance(x, MyClass) |
MyClass.__instancecheck__(x) |
| 一个类是否是你的类的子类 | isinstance(C, MyClass) |
MyClass.__subclasscheck__(C) |
| 一个类是否是抽象基类的实例 | isinstance(C, MyABC) |
MyABC.__subclasshook__(C) |
1. Python 魔法方法的更多相关文章
- Python魔法方法总结及注意事项
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
- python魔法方法:__getattr__,__setattr__,__getattribute__
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...
- python魔法方法大全
1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...
- python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...
- with上下文管理 python魔法方法
with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...
- python 魔法方法诠释
什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...
- python 魔法方法
I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...
- python 魔法方法之:__getitem__ __setitem__ __delitem__
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- python 魔法方法(学习过程的笔记)
有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两 ...
随机推荐
- QT 等待对话框/进度--
用QT的,加载的一张gif图片.记录下来以后免得忘记. #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include < ...
- DOM解析xml实现读、写、增、删、改
qt提供了三种方式解析xml,不过如果想实现对xml文件进行增.删.改等操作,还是DOM方式最方便. 项目配置 pro文件里面添加QT+=xml include <QtXml>,也可以in ...
- css3 位置选择器 类似jq的:eq(0)
JQ使用 :eq(位置),可以选择第几个元素 CSS3里面新增了一个用法,:nth-child(位置) 可实现和JQ同样的功能 需要注意的是jq第一个是从0开始,CSS的第一个是从1开始
- SAP和去哪儿网面试感悟
这两天先后面了两家公司,个人感觉挺有意思,就写下来.现在是4月份,校招基本没有了,去哪儿网刚好有春招,我就去试试.SAP是同学推荐的. 去哪儿.参加笔试,个人感觉还行.半个月后收到面试通知.到了面试现 ...
- Win8Metro(C#)数字图像处理--2.14Prewitt 边缘检测
原文:Win8Metro(C#)数字图像处理--2.14Prewitt 边缘检测 [函数名称] 图像Prewitt边缘检测函数PrewittEdgeProcess(WriteableBitmap ...
- python脚本,重新设置图片大小
最近在做一个android的电台,此android程序要访问自己服务器上的歌曲文件,包括图片.这些文件要自己手动上传. 每天十首歌,需要二十个图片(一个大图450*450.一个小图140*140). ...
- mac下实现代码远程同步
近期将办公电脑从windows换成了mac,以前一直用windows,在windows下面将代码同步到远程的开发机,zend studio有一些内置的工具,但mac下的zend stduio没有了这个 ...
- 转一个git的命令
Git远程操作详解 Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Git远程操作. git clone git rem ...
- SpringBoot实现文件上传
前言参考:快速开发第一个SpringBoot应用 这篇文章会讲解如何使用SpringBoot完成一个文件上传的过程,并且附带一些SpringBoot开发中需要注意的地方 首先我们写一个文件上传的htm ...
- 简单学习js
由于是个前端小白,通过这一两天的学习html,css,js和jquery等,基本上前端会用了,而且熟悉我博客的人来说,没错,我把自己的博客给优化了一下(一些大佬都是禁用模板的所有样式,然后自己设计页面 ...