python进阶之魔法函数
__repr__
Python中这个__repr__函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串.
如果我们直接打印一个类,向下面这样
class A():
def __init__(self,name=None,id=1):
self.id=id
self.name=name
if __name__ == '__main__':
a=A()
print(a)
输出结果
<__main__.A object at 0x0000018DF8E7EAC8>
不是很友好,返回了一个对象的内存地址。
我们改成下面再次输出
class A():
def __init__(self,name=None,id=1):
self.id=id
self.name=name
def __repr__(self):
return "进入函数"
if __name__ == '__main__':
print(A())
输出结果
进入函数
__str__
class A():
def __init__(self,name=None,id=1):
self.id=id
self.name=name
def __str__(self):
return "进入函数"
if __name__ == '__main__':
print(A())
输出结果
进入函数
比较repr和str
上面我们发现在print的时候,两个魔法函数显示的效果是一样的,那这两个魔法函数区别在哪呢,__repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员。在print的时候两者项目一样,但是在交互命令下
__repr__同样有着print的效果,但是__str__还是输出对象内存地址。也就说在交互式命令下我们可以看到其效果,另外__str__ 方法其实调用了 __repr__ 方法。
__getitem__
如果在类中定义了getitem__()方法,那么他的实例对象(假设为A)就可以这样A[key]取值。当实例对象做A[key]运算时,就会调用类中的__getitem()方法。
class A():
def __init__(self,name=None,id=1):
self.id=id
self.name=name
def __repr__(self):
return "进入函数"
def __getitem__(self, item):
return item
if __name__ == '__main__':
a=A('lisa','123')
print(a['name'])
print(a[124])
输出
name
124
实例对象的key不管是否存在都会调用类中的__getitem__()方法。而且返回值就是__getitem__()方法中规定的return值。也就是说如果getitem里的方法写的不好就没有了意义了。
我们修改下代码,改变getitem的return的值
class A():
def __init__(self,name=None,id=1):
self.id=id
self.name=name
def __repr__(self):
return "进入函数"
def __getitem__(self, item):
return self.__dict__[item]
if __name__ == '__main__':
a=A('lisa','123')
print(a['name'])
print(a[123])
输出
lisa
keyerror:123
输出了lisa和一个异常,改后的getitem做了什么事呢,
self.__dict__,是获取当前实例的所有属性的字典格式,后面的[item]就是取其对于的键值,这里我传了个name,实际就是取name属性的值也就是lisa。
对于123因为不存在这个属性所有报错了。这也是字典内部实现的一部分。
再来看一个例子,代码里已经加入了注释:
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
# 具名元组动态创建一个类Card,并含有两个属性rank和suit
# 用以构建只有少数属性但是没有方法的对象
class FrenchDeck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 扑克牌2到A组成的列表
suits = 'spades diamonds clubs hearts'.split() # 四种花色
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] # 笛卡尔积,13*4=52(除去两个王)
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
# 调用f[0]时会进入
return self._cards[position]
if __name__ == '__main__':
f = FrenchDeck()
print(f[0])
# 在这里f[0]实际是f.__getitem__(0)
输出
Card(rank='2', suit='spades')
我们发现这个例子中还有一个__len__,那这个方法是干嘛的呢,我们继续往下看
__len__
在上面的例子中我们使用该方法,这个方法会在什么情况下发生呢,一个小例子来说明。
class B():
def __init__(self):
self.a_list = range(10)
def __len__(self):
return len(self.a_list)
if __name__ == '__main__':
b = B()
print(len(b))
#在这里等价于
#print(b.__len__())
输出
10
我们在调用len方法的时候会调用__len__。
__setitem__
__setitem__(self,key,value):该方法应该按一定的方式存储和key相关的value。在设置类实例属性时自动调用的。
class B():
def __init__(self):
self.a_list = range(10)
def __setitem__(self, key, value):
self.__dict__[key] = value
def cfun(a, b, c):
print("新加入函数c")
if __name__ == '__main__':
b = B()
b['a_list'] = "123" # 这个会调用B类的\__setitem_方法_
B.__setitem__ = cfun # 改变settime方式变为cfun这个函数
b['a_list'] = "123" # 这次实际会调用cfun函数
print(b.a_list)
输出
新加入函数c
123
__delitem__
执行del函数的时候会调用,如果继承了 继承
abc.MutableSequence的类就必须实现 __delitem__ 方法,这是 MutableSequence 类的一个抽象方法。
__eq__
a == b等同于a.__eq__(b)。
你可以在自己的类中定义 __eq__ 方法,决定 == 如何比较
实例。如果不覆盖 __eq__ 方法,那么从 object 继承的方法比较
python进阶之魔法函数的更多相关文章
- python 常用的魔法函数
简介 在实际项目中,我们其实并不会太多的使用魔法函数,但是一些方法或者函数均是有魔法函数演变而来的,且在一些面试过程中会遇到一些关于常见方法的实现,就会牵扯到相应的魔法函数,此处将介绍一些我认为比较常 ...
- python 类的魔法函数 内置函数 类方法 静态方法 抽象类
魔法函数 __init__函数 init函数会在实例化A这个类的时候被调用 class A(): def __init__(self): print('__init__函数') a = A() 显示结 ...
- Python 进阶 之 enumerate()函数
enumerate()是Python的内置函数,无需依赖包,enumerate()作用是可以将生成器包装成生成器,类似于range,但enumerate()可以自动生成索引. enumerate(pa ...
- python进阶之内置函数和语法糖触发魔法方法
前言 前面已经总结了关键字.运算符与魔法方法的对应关系,下面总结python内置函数对应的魔法方法. 魔法方法 数学计算 abs(args):返回绝对值,调用__abs__; round(args): ...
- Python进阶之返回函数
返回函数 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB"," ...
- Python进阶-VI 生成器函数进阶、生成器表达式、推导式
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...
- Python进阶-I 初识函数(function)
函数 在java中叫方法. 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print() ...
- Python进阶之匿名函数(关键词lambda)
匿名函数 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB"," ...
- Python进阶1---高阶函数、柯里化
高阶函数 不相等 自定义sort函数 内建函数--高阶函数 #sort函数 def sort2(lst,key = None,reverse = False): res = [] if key is ...
随机推荐
- 101空降师506团2营E连全体成员
吕天一 https://coding.net/u/Richardlv http://www.cnblogs.com/Richardlv/ 李伟亮 https://coding.net/u/201304 ...
- Exchange2010批量删除邮件
在Exchange2010里若要删除某个用户发出的邮件,可以通过EMC控制台授予管理员“管理完全访问权限”,通过OWA登录到用户邮箱删除.另外,更简便的方法为使用Exchange2010的命令来处理, ...
- php常用几种设计模式的应用场景
1.单例设计模式 所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中! 单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接. ...
- codeforces1A
Theatre Square CodeForces - 1A 一个城市的广场面积有 N×M平方米,过段时间,恰逢这个城市的庆典活动,主办方决定在广场上铺设一种新的地砖,这种地砖每块都是a×a平方米的. ...
- HUAS 2018暑假第一周比赛-题解
小朋友们有问题评论区 :) B. 子串计算 难度系数 : ☆ Main idea : 模拟 暴力 按照题目的要求一步一步来就行了 之所以可行的原因是从左往右扫,如果扫到一个子串,把它删除掉之后,假设当 ...
- python_面向对象小试题
打印啥? class Animal(object): hobby = "eat" def run(self): print(self.hobby) return self.hobb ...
- [SDOI2017]硬币游戏
考虑生成函数来做 g(x)函数就是0+0*x+...+1*x^s+...+|∑|^(n-s)x^n 就是最后s位必须填这个串,但是前面随便填的方案数 然后枚举之前出现了哪个串(包括自己),如果没有相交 ...
- 缓存面板获取之前页面选中的数据Objuid的方法
String partUid = request.getParameter("contextInstanceUid"); contextInstanceUid是存在总线总的键名,存 ...
- 21天实战caffe笔记_第三天
1 深度学习工具汇总 (1) caffe : 由BVLC开发的基于C++/CUDA/Python实现的卷积神经网络,提供了面向命令行.Matlab和Python的绑定接口.特性如下: A 实现了前馈 ...
- Andrew Ng机器学习课程,第一周作业,python版本
Liner Regression 1.梯度下降算法 Cost Function 对其求导: theta更新函数: 代码如下: from numpy import * import numpy as n ...