有小伙伴会问,什么是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 魔法方法(学习过程的笔记)的更多相关文章

  1. Python魔法方法总结及注意事项

    1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...

  2. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  3. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  4. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  5. 1. Python 魔法方法

    Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...

  6. with上下文管理 python魔法方法

    with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...

  7. python 魔法方法诠释

    什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...

  8. python 魔法方法

    I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...

  9. python 魔法方法之:__getitem__ __setitem__ __delitem__

    h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...

随机推荐

  1. HDU 6033 Add More Zero (数学)

    Description There is a youngster known for amateur propositions concerning several mathematical hard ...

  2. 获取本机IP(适用于Linux系统)

    获取本机IP(适用于Linux系统) /** * @desc 获取本机IP(适用于Linux系统) * @return Ip */ public static String getLocalIP() ...

  3. 关于发布中报“未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项”的问题解决方法

    遇到这个问题了,我也是醉了,开发就一个还在忙别的事情,我想想自己解决 你们遇到过吗?我在网上找到好多解决的方法,比如改webconfig文件,或者改package.config文件,都没用.但是我看到 ...

  4. 版本管理工具Git(1)带你认识git

    简介 本篇将带领大家认识,git.github,让大家对git有基本的认识:下面将持续更新几篇文章来介绍git,见git导航: 下一篇中将讲解git的安装及使用: Git系列导航 版本管理工具Git( ...

  5. angular学习(二)-- Directive

    1.2 指令:Directive AngularJS 通过被称为 指令 的新属性来扩展 HTML, 具体表现形式一般为带有前缀 ng-xxx 的 HTML 属性. 指令的使用形式 ng-xxx 的属性 ...

  6. wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!

    昨天在mvvm wpf的开发中遇到一个问题,绑定不起作用,编辑阶段没问题也没有提示找不到对应的绑定,但是在运行之后却不起作用,查了很多资料,说法不一,有些是要删除datagrid的一行,直接绑定del ...

  7. MySQL数据库— 汇总和分组数据

    一 汇总和分组数据 查询语句 ---> 结果集(多条数据) ---> 聚合函数  ----> 单行记录 1.常用的聚合函数: sum()         数字             ...

  8. JavaScript中的不同逻辑算法结合操作解决实际多重问题以及常用函数类型

    数组去重+快速排序 //老数组var arr1 = [1,2,2,3,8,6,6,4,5,5];//定义新数组var arr2 = [ ];内部可运用布尔型进行判断数组的唯一性 for(i=0;i&l ...

  9. Node.js之使用Buffer类处理二进制数据

    Node.js之使用Buffer类处理二进制数据 Buffer类可以在处理TCP流或文件流时处理二进制数据,该类用来创建一个专门存放二进制数据的缓存区. 1. 创建Buffer对象 1.1 直接创建: ...

  10. Android上传图片到服务器,服务端利用.NET WCFRest服务读取文件的解决方案

    在项目中遇到要将Android设备拍摄的照片上传的服务器,将文件保存在服务器本地的文件夹中,数据库中保存的是图片文件名.整个上传是将图片生成二进制流通过HTTP请求上传到服务端,服务端是基于.NET环 ...