python 魔法方法(学习过程的笔记)
有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢,
它们在面向对象的Python的处处皆是。它们是一些可以让你对类添加“魔法”的特殊方法。 它们经常是两个下划线包围来命名的。
我感觉魔法方法很牛逼的,
目前我们常见的魔法方法大致可分为以下几类:
- 构造与初始化
- 类的表示
- 访问控制
- 比较操作
- 容器类操作
- 可调用对象
- Pickling序列化
在我们写python中最常见的就是__init__,这是python的构造方法,这是初始化对象,定义一个对象的初始化的值,__new__ 这个我们在实际的很少用到吧, 不过在一些开源的框架到我们能用到这个,__new__返回值是一个实例,
__del__
这个方法代表析构方法,也就是在对象被垃圾回收时被调用。但是请注意,执行del x
不一定会执行此方法
__str__
/__repr__
这两个魔法方法一般会放到一起进行讲解,它们的主要差别为:
__str__
强调可读性,而__repr__
强调准确性/标准性__str__
的目标人群是用户,而__repr__
的目标人群是机器,它的结果是可以被执行的%s
调用__str__
方法,而%r
调用__repr__
方法
__setattr__
通过此方法,对象可在在对属性进行赋值时进行控制,所有的属性赋值都会经过它。
一般常用于对某些属性赋值的检查校验逻辑,例如age
不能小于0,否则认为是非法数据等等。
__getattr__
很多同学以为此方法是和__setattr__
完全对立的,其实不然!
这个方法只有在访问某个不存在的属性时才会被调用,看上面的例子,由于gender
属性在赋值时,忽略了此字段的赋值操作,所以此属性是没有被成功赋值给对象的。当访问这个属性时,__getattr__
被调用,返回unknown
。
__del__
删除对象的某个属性时,此方法被调用。一般常用于某个属性必须存在,否则无法进行后续的逻辑操作,会重写此方法,对删除属性逻辑进行检查和校验。
__getattribute__
这个方法我们很少用到,它与__getattr__
很容易混淆。它与前者的区别在于:
__getattr__
访问某个不存在的属性被调用,__getattribute__
访问任意属性被调用
__getattr__
只针对属性访问,__getattribute__
不仅针对所有属性访问,还包括方法调用
__iter__
执行for x in obj
时触发执行,用于迭代容器内的元素。
__contains__
执行x in obj
时触发执行,用于判断某个元素是否存在于容器中。
__reversed__
执行reversed(obj)
时触发执行,用于反转容器的元素,具体的反转逻辑可自己实现。
反射
__nstancecheck__(self, instance)
:检查一个实例是否是你定义类中的一个实例__ubclasscheck__(self, subclass)
:检查一个类是否是你定义类的子类
数值操作符
就像你可以使用比较操作符来比较类的实例,你也可以定义数值操作符的行为。固定好你的安全带,这样的操作符真的有很多。看在组织的份上,我把它们分成了五类:一元操作符,常见算数操作符,反射算数操作符,增强赋值操作符,和类型转换操作符。
一元操作符
一元操作符只有一个操作符。
- __pos__(self)
实现取正操作,例如 +some_object。
__neg__(self)
实现取负操作,例如 -some_object。
__abs__(self)
实现内建绝对值函数 abs() 操作。
__invert__(self)
实现取反操作符 ~。
__round__(self, n)
实现内建函数 round() ,n 是近似小数点的位数。
__floor__(self)
实现 math.floor() 函数,即向下取整。
__ceil__(self)
实现 math.ceil() 函数,即向上取整。
__trunc__(self)
实现 math.trunc() 函数,即距离零最近的整数。
常见算数操作符
现在,我们来看看常见的二元操作符(和一些函数),像+,-,*之类的,它们很容易从字面意思理解。
__add__(self, other)
实现加法操作。
__sub__(self, other)
实现减法操作。
__mul__(self, other)
实现乘法操作。
__floordiv__(self, other)
实现使用 // 操作符的整数除法。
__div__(self, other)
实现使用 / 操作符的除法。
__truediv__(self, other)
实现 _true_ 除法,这个函数只有使用 from __future__ import division 时才有作用。
__mod__(self, other)
实现 % 取余操作。
__divmod__(self, other)
实现 divmod 内建函数。
__pow__
实现 ** 操作符。
__lshift__(self, other)
实现左移位运算符 << 。
__rshift__(self, other)
实现右移位运算符 >> 。
__and__(self, other)
实现按位与运算符 & 。
__or__(self, other)
实现按位或运算符 | 。
__xor__(self, other)
实现按位异或运算符 ^ 。
class DictDemo:
def __init__(self,key,value):
self.dict={}
self.dict[key]=value
def __getitem__(self,key):
return self.dict[key]
def __setitem__(self,key,value):
self.dict[key]="key's value is %s"%value
def __len__(self):
return (len(self.dict))
dictDemo=DictDemo('key0','value1')
print(dictDemo['key0'])
dictDemo['key1']='beijing'
print(dictDemo['key1'])
print(len(dictDemo))
class word(str):
def __eq__(self,other):
return len(self)==len(other) w1=word('idshfisdojf')
w2=word('sadsadas')
print(w1==w2)
print(len(w1))
class Apple(object):
def __init__(self,name,size):
self.name=name
self.size=size
def __str__(self):
return 'name is {}: size is {}'.format(self.name,self.size)
print(Apple('liwanlei',''))
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return 'name :%s, age:%s'%(self.name,self.age)
def __repr__(self):
return "Person( '%s'%s)"%(self.name,self.age)
person=Person('leizi','')
print(str(person))#name :leizi, age:18
print(repr(person))#Person( 'leizi'18)
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 _ ...
- 1. Python 魔法方法
Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...
- 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 ...
随机推荐
- [COGS 1752] 摩基亚Mokia
照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in 输出文件:mokia.out 时间限制:1.5 s 内存限制:128 MB [题目描述] 摩尔瓦多的移 ...
- ETL作业调度工具TASKCTL软件安装乱码问题解决
前两天在安装批量作业调度软件TASKCTL4.5时,将安装介质解压出来后执行安装脚本时,一安装就出现下图乱码. 然后就度娘了一下,发现安装遇到乱码的人还挺多的,大多数解答都说TASKCTL软件里面很多 ...
- Web项目、Http协议简介
Web 静态web项目 静态web项目就是一个文件夹.静态Web项目 就是文件夹中都是静态资源. 如何将web项目部署到tomcat? 将web项目的文件夹复制到webapps目录下.比如把test文 ...
- 利用dbutils工具实现数据的增删查改操作(dbutis入门)
一.前期准备 1.安装数据库(如:mysql5.5) 2.安装Eclipse(如:3.4) 3.下载数据库驱动包 4.下载dbutis工具包 5.在Eclipse创建名为 dbutils 的工程并在工 ...
- Python爬虫从入门到放弃(二十)之 Scrapy分布式原理
关于Scrapy工作流程回顾 Scrapy单机架构 上图的架构其实就是一种单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列. 分布式架 ...
- js验证15位或18位身份证
本篇文章是本人在网上搜集了一些验证,然后又个人进行一定修改的关于身份证的验证,欢迎修改指正..... function IdCardValidateRule(idCard) { var tip; ...
- 实现wpf的值转换器
从数据库取出来的数据是1,2,3,4,5,不过要显示在控件上的,是1,2,3,4,5对应的string值,怎么办?wpf提供了很好的实现方法,那就是值转换器,我们需要做的是: 1.定义值转换类,继承I ...
- python基础===zip在python3中的用法
name=["ad","kein","tom"] age=[23,45,22] tel=['157','139','167'] print( ...
- Orleans稍微复杂的例子—互动
这是Orleans系列文章中的一篇.首篇文章在此 我费力费心的翻译过官方的教程,但是本人英语词汇量不高,可是架不住电子词典啊-只要肯花时间,我这些内容谁都可以做出来.所以这个事例告诉我们一个道理,那就 ...
- MySQL的left,substr,instr截取字符串函数使用实例
原表:select * from pagereferrer;如下: 如何在这张表中,查询出按 URL分类的信息 ,例如:211.95.60.43:8080算一类信息,并按百分比显示.预期结 ...