Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法
在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法
有哪些重要的魔术方法?
__new__
https://www.cnblogs.com/poloyy/p/15236309.html
__init__
https://www.cnblogs.com/poloyy/p/15189562.html
__str__
https://www.cnblogs.com/poloyy/p/15202541.html
__repr__
https://www.cnblogs.com/poloyy/p/15250973.html
__del__
https://www.cnblogs.com/poloyy/p/15192098.html
__call__
https://www.cnblogs.com/poloyy/p/15253366.html
其他比较常见的魔术方法
__len__
len() 调用对象会返回 __len__ 方法 return 的值,必须返回 integer
class A:
def __len__(self):
return 4 a = A()
print(len(a)) # 输出结果
4
__hash__
hash() 调用对象会返回 __hash__ 方法 return 的值,必须返回 integer
# __hash__
class A:
def __hash__(self):
return 123456 a = A()
print(hash(a)) # 输出结果
123456
__eq__
定义等于号的行为:x == y
class A:
def __init__(self):
self.a = 1
self.b = 2 def __eq__(self, obj):
print("call eq method.")
if self.a == obj.a and self.b == obj.b:
return True a = A()
b = A()
# 实例对象有 == 行为时,自动调用 __eq__() 方法
print(a == b) # 输出结果
call eq method.
True
比较操作符的魔术方法
| __lt__(self, other) | 定义小于号的行为:x < y 调用 x.__lt__(y) |
| __le__(self, other) | 定义小于等于号的行为:x <= y 调用 x.__le__(y) |
| __ne__(self, other) | 定义不等号的行为:x != y 调用 x.__ne__(y) |
| __gt__(self, other) | 定义大于号的行为:x > y 调用 x.__gt__(y) |
| __ge__(self, other) | 定义大于等于号的行为:x >= y 调用 x.__ge__(y) |
魔术方法大全
|
魔法方法
|
含义
|
| 基本的魔法方法 | |
| __new__(cls[, ...]) | 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 |
| __init__(self[, ...]) | 构造器,当一个实例被创建的时候调用的初始化方法 |
| __del__(self) | 析构器,当一个实例被销毁的时候调用的方法 |
| __call__(self[, args...]) | 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b) |
| __len__(self) | 定义当被 len() 调用时的行为 |
| __repr__(self) | 定义当被 repr() 调用时的行为 |
| __str__(self) | 定义当被 str() 调用时的行为 |
| __bytes__(self) | 定义当被 bytes() 调用时的行为 |
| __hash__(self) | 定义当被 hash() 调用时的行为 |
| __bool__(self) | 定义当被 bool() 调用时的行为,应该返回 True 或 False |
| __format__(self, format_spec) | 定义当被 format() 调用时的行为 |
| 有关属性 | |
| __getattr__(self, name) | 定义当用户试图获取一个不存在的属性时的行为 |
| __getattribute__(self, name) | 定义当该类的属性被访问时的行为 |
| __setattr__(self, name, value) | 定义当一个属性被设置时的行为 |
| __delattr__(self, name) | 定义当一个属性被删除时的行为 |
| __dir__(self) | 定义当 dir() 被调用时的行为 |
| __get__(self, instance, owner) | 定义当描述符的值被取得时的行为 |
| __set__(self, instance, value) | 定义当描述符的值被改变时的行为 |
| __delete__(self, instance) | 定义当描述符的值被删除时的行为 |
| 比较操作符 | |
| __lt__(self, other) | 定义小于号的行为:x < y 调用 x.__lt__(y) |
| __le__(self, other) | 定义小于等于号的行为:x <= y 调用 x.__le__(y) |
| __eq__(self, other) | 定义等于号的行为:x == y 调用 x.__eq__(y) |
| __ne__(self, other) | 定义不等号的行为:x != y 调用 x.__ne__(y) |
| __gt__(self, other) | 定义大于号的行为:x > y 调用 x.__gt__(y) |
| __ge__(self, other) | 定义大于等于号的行为:x >= y 调用 x.__ge__(y) |
| 算数运算符 | |
| __add__(self, other) | 定义加法的行为:+ |
| __sub__(self, other) | 定义减法的行为:- |
| __mul__(self, other) | 定义乘法的行为:* |
| __truediv__(self, other) | 定义真除法的行为:/ |
| __floordiv__(self, other) | 定义整数除法的行为:// |
| __mod__(self, other) | 定义取模算法的行为:% |
| __divmod__(self, other) | 定义当被 divmod() 调用时的行为 |
| __pow__(self, other[, modulo]) | 定义当被 power() 调用或 ** 运算时的行为 |
| __lshift__(self, other) | 定义按位左移位的行为:<< |
| __rshift__(self, other) | 定义按位右移位的行为:>> |
| __and__(self, other) | 定义按位与操作的行为:& |
| __xor__(self, other) | 定义按位异或操作的行为:^ |
| __or__(self, other) | 定义按位或操作的行为:| |
| 反运算 | |
| __radd__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rsub__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rmul__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rtruediv__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rfloordiv__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rmod__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rdivmod__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rpow__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rlshift__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rrshift__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rand__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rxor__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __ror__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| 增量赋值运算 | |
| __iadd__(self, other) | 定义赋值加法的行为:+= |
| __isub__(self, other) | 定义赋值减法的行为:-= |
| __imul__(self, other) | 定义赋值乘法的行为:*= |
| __itruediv__(self, other) | 定义赋值真除法的行为:/= |
| __ifloordiv__(self, other) | 定义赋值整数除法的行为://= |
| __imod__(self, other) | 定义赋值取模算法的行为:%= |
| __ipow__(self, other[, modulo]) | 定义赋值幂运算的行为:**= |
| __ilshift__(self, other) | 定义赋值按位左移位的行为:<<= |
| __irshift__(self, other) | 定义赋值按位右移位的行为:>>= |
| __iand__(self, other) | 定义赋值按位与操作的行为:&= |
| __ixor__(self, other) | 定义赋值按位异或操作的行为:^= |
| __ior__(self, other) | 定义赋值按位或操作的行为:|= |
| 一元操作符 | |
| __pos__(self) | 定义正号的行为:+x |
| __neg__(self) | 定义负号的行为:-x |
| __abs__(self) | 定义当被 abs() 调用时的行为 |
| __invert__(self) | 定义按位求反的行为:~x |
| 类型转换 | |
| __complex__(self) | 定义当被 complex() 调用时的行为(需要返回恰当的值) |
| __int__(self) | 定义当被 int() 调用时的行为(需要返回恰当的值) |
| __float__(self) | 定义当被 float() 调用时的行为(需要返回恰当的值) |
| __round__(self[, n]) | 定义当被 round() 调用时的行为(需要返回恰当的值) |
| __index__(self) | 1. 当对象是被应用在切片表达式中时,实现整形强制转换 2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 __index__ 3. 如果 __index__ 被定义,则 __int__ 也需要被定义,且返回相同的值 |
| 上下文管理(with 语句) | |
| __enter__(self) | 1. 定义当使用 with 语句时的初始化行为 2. __enter__ 的返回值被 with 语句的目标或者 as 后的名字绑定 |
| __exit__(self, exc_type, exc_value, traceback) | 1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么 2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作 |
| 容器类型 | |
| __len__(self) | 定义当被 len() 调用时的行为(返回容器中元素的个数) |
| __getitem__(self, key) | 定义获取容器中指定元素的行为,相当于 self[key] |
| __setitem__(self, key, value) | 定义设置容器中指定元素的行为,相当于 self[key] = value |
| __delitem__(self, key) | 定义删除容器中指定元素的行为,相当于 del self[key] |
| __iter__(self) | 定义当迭代容器中的元素的行为 |
| __reversed__(self) | 定义当被 reversed() 调用时的行为 |
| __contains__(self, item) | 定义当使用成员测试运算符(in 或 not in)时的行为 |
回头再用到哪些再详解吧
Python - 面向对象编程 - 魔术方法(双下划线方法)的更多相关文章
- Python中的魔术(双下划线'__xxx__')方法详解
介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...
- python面向对象双下划线方法与元类
目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...
- python_面向对象——双下划线方法
1.__str__和__repe__ class Person(object): def __init__(self,name,age): self.name = name self.age = ag ...
- python类中的双下划线方法
__getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...
- python类中方法加单下划线、双下划线、前后双下滑线的区别
首先看一段代码: class Foo(): def __init__(self): print "__init__ method" def public_method(self): ...
- Python中单下划线与双下划线用法总结
看mentor的脚本时,遇到self._item.callspec.getparam('')语句,理解起来比较困难,找到一篇文章,记录的比较详细,特别记录一下,以备复习. 附链接地址:http://w ...
- 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问
from:https://zhuanlan.zhihu.com/p/30553607 小编在最初使用上Python之后,就一发不可收拾,人生苦短.我用Python,不光是因为其优雅简洁, ...
- Python笔记_第三篇_面向对象_4.单下划线和双下划线
说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
随机推荐
- Netty入门(二):Channel
前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel 在Netty框架中,Channel是其中之一的核心概念,是Netty网络通信的主体,由它 ...
- Windows协议 LDAP篇 - 组&OU
LDAP搜索 LDAP查找 位操作 以userAccountControl为例,CN=User-Account-Control,CN=Schema,CN=Configuration,DC=muxue, ...
- 跟我一起写 Makefile(三)
Makefile 总述 ------- 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个 ...
- 用VirtualBox搭建虚拟局域网
用 Oracle VM VirtualBox 安装虚拟机,我在Windows 7上安装了ubuntu 11.10和xubuntu12.04两个虚拟机: 将这两个虚拟机的"网络"属性 ...
- tomcat服务监控分析及自启
#! /bin/bash # process-monitor.sh serverName="/usr/local/apache-tomcat-7.0.72-8080" #获取进程i ...
- kubernetes中headless类型的service
目录 初识headless类型的service 开始研究headless类型的service headless类型的service之我的理解 初识headless类型的service 第一次使用ran ...
- .NET WebApi 实战第五讲之EntityFramework事务
在<.NET WebApi 实战第二讲>中我们有提到过事务的概念!任何数据库的读操作可以没有事务,但是写事件必须有事务,如果一个后端工程师在数据库写入时未添加事务,那就不是一个合格的工程师 ...
- .Net Core WebApi(三)--使用 IdentityServer4 4.1.1 踩坑记录
目的:创建IdentityServer 并通过PostMan验证获取token 第一次配置如下 public class Config { public static IEnumerable<A ...
- C#基础知识---扩展方法
一.简介 扩展方法为现有的类型(.Net类型或者自定义类型)扩展应该附加到该类型中的方法. 二.基本原则 定义一个非嵌套.非泛型的静态类 扩展方法是静态的 扩展方法至少要有一个参数,该参数类型是要扩展 ...
- spring boot 2.0.0 + shiro + redis实现前后端分离的项目
简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大 ...