构造和初始化

__init__(self, args)

构造函数

__new__(cls)

传入的是类实例

__del__(self)

析构函数,调用 del cls 时会被调用

属性访问控制

__getattr__(self, name)

如果属性已经定义了那么不会再执行__getattr__()了,而是直接通过访问实例字典返回结果,__getattr__()只在访问未定义的属性时被触发

__setattr__(self, name, value)

直接给属性赋值 cls.name = value, 如果该函数内部内部使用self.name = value 时会产生“无限递归”的错误,正确的方式应该是

1
2
def (self, name, value):
self.__dict__[name] = value
__delattr__(self, name)

del cls.name 时会被调用

描述器对象

__set__(self, cls, value)

cls.innercls = value 用于类中的其他类对象赋值

__get__(self, cls)

cls.innercls 返回类中其他对象传回的值

__delete__(self, cls)

del cls.innercls

综合实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Meter(object):
'''Descriptor for a meter.'''
def __init__(self, value=0.0):
self.value = float(value)
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
self.value = float(value) class Foot(object):
'''Descriptor for a foot.'''
def __get__(self, instance, owner):
return instance.meter * 3.2808
def __set__(self, instance, value):
instance.meter = float(value) / 3.2808 class Distance(object):
大专栏  python常用魔术方法概览pan class="line"> meter = Meter()
foot = Foot() d = Distance()
print d.meter, d.foot
d.meter = 1
print d.meter, d.foot # 1.0 3.2808
d.meter = 2
print d.meter, d.foot # 2.0 6.5616

自定义容器(Container)

__len__(self)

len(con) 返回容器长度

__setitem__(self, name, value)

con[name] = value 直接下标赋值

__getitem__(self, name)

con[name] 直接下标访问

__delitem__(name)

del con[name] 删除下标

__iter__(self)

使得容器支持迭代器方式访问 for x in con

__contains__(self, item)

name in con 可以返回布尔值

__missing__(self, name)

容器中没有name时会被调用

上下文管理

with 关键字可实现上下文(环境)管理

__enter__(self)

进入环境时触发

__exit__(self, exception_type, exception_value, traceback)

退出环境时触发,一般用来关闭资源

运算符重载

__eq__(self, other)

重载 =

__ne__(self, other)

重载 !=

__lt__(self, other)

重载 <

__gt__(self, other)

重载 >

__le__(self, other)

重载 <=

__ge__(self, other)

重载 >=

其他

__str__(self)

print(cls)str(cls) 时被调用,必须返回字符str类型

__repr__(self)

对实例使用repr()时调用。str()repr()都是返回一个代表该实例的字符串,主要区别在于: str()的返回值要方便人来看,而repr()的返回值方便计算机看。

__call__(self, *args, **kwargs)
1
2
3
4
5
6
7
8
9
10
11
12
class XClass:
def __call__(self, a, b):
return a + b def add(a, b):
return a + b x = XClass()
print 'x(1, 2)', x(1, 2)
print 'callable(x)', callable(x) # True
print 'add(1, 2)', add(1, 2)
print 'callable(add)', callable(add) # True

https://segmentfault.com/a/1190000007256392#articleHeader3

python常用魔术方法概览的更多相关文章

  1. php中的常用魔术方法总结

    以下是对php中的常用魔术方法进行了详细的总结介绍,需要的朋友可以过来参考下 常用的魔术方法有:__Tostring () __Call() __autoLoad() __ clone() __GET ...

  2. python的魔术方法大全

    在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,这 ...

  3. [Python3 填坑] 014 类的常用魔术方法举例

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __init__() 2.2 __new__() 2.3 __call__() 2.4 __str__() 2.5 __repr__() ...

  4. python类的继承、多继承及其常用魔术方法

    继承 一个类可以派生出一个子类,这个子类可以使用父类的属性及方法,也可以在父类的基础上添加自己的独特属性或方法.属性和方法的继承的顺序是先从自己开始,找不到再去找父类,父类没有再找父类的父类,其尽头就 ...

  5. Python中的常用魔术方法介绍

    1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中) 参数:至少有一个self,接收对象 返回值:无 作用:初始化对象的成员 注意:使用该方式初 ...

  6. Python面向对象5:类的常用魔术方法

    魔术方法就是不需要人为调用的方法,基本是在特定的时刻自动触发- 魔术方法的统一的特征,方法名被前后各两个下滑线包裹 - 操作类 - `__init__`: 构造函数 - `__new__`: 对象实例 ...

  7. Python 基础之面向对象之常用魔术方法

    一.__init__魔术属性 触发时机:实例化对象,初始化的时候触发功能:为对象添加成员,用来做初始化的参数:参数不固定,至少一个self参数返回值:无 1.基本用法 #例:class MyClass ...

  8. Python的魔术方法总结

    魔术方法:再不需要程序员定义,本身就存在类中的方法就是魔术方法. 魔术方法通常都长这样:__名字__. 1.__str__和__repr__ 为了方便记忆看如下列子 class Course: def ...

  9. python的魔术方法

    什么叫魔术方法: 在python中定义以双下划线开头,有一些python自定义的函数,并且以双下划线为结尾的函数叫做魔法函数 class Company(object): def __init__(s ...

随机推荐

  1. iOS 中UITableView的深理解

    例如下图:首先分析一下需求:1.根据模型的不同状态显示不同高度的cell,和cell的UI界面. 2.点击cell的取消按钮时,对应的cell首先要把取消按钮隐藏掉,然后改变cell的高度. 根据需求 ...

  2. LeetCode——919.完全二叉树插入器

    完全二叉树是每一层(除最后一层外)都是完全填充(即,结点数达到最大)的,并且所有的结点都尽可能地集中在左侧. 设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作: CBT ...

  3. 14 微服务电商【黑马乐优商城】:day02-springcloud(理论篇一:HttpClient的简单使用)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一: ...

  4. 学习LCA( 最近公共祖先·二)

    http://poj.org/problem?id=1986 离线找u,v之间的最小距离(理解推荐) #include<iostream> #include<cstring> ...

  5. ubuntu下切换默认的python版本

    Ubuntu系统自带python2.7(默认)和python3.5,所以不需要自己安装python.我们可以使用命令python -V或python3 -V来查看默认的python版本. 现在越来越多 ...

  6. 解决 Win7 远程桌面 已停止工作的问题

    Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...

  7. 2019-ECfinal-M题-value

    题目传送门 sol:每个下标都有选和不选两种情况,所以总方案数是$2^{n}$,在$n$最大是$100000$的情况下不符合要求.可以这样想,假设$i^{p}=k$有符合题目要求的解,还有一个整数$j ...

  8. shell_常规小脚本

    shell 1.检查Mysql的健康状态 #!/bin/bashpgrep -x mysqld &> /dev/nullif [ $? -ne 0 ]thenecho “At time: ...

  9. npm 切换成淘宝镜像

    npm install nrm -g nrm use taobao

  10. maven中 pom 文件各个标签的作用

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...