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():
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():
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 继承的方法比较
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 魔兽世界wlk暗牧一键输出宏是什么 wlk暗牧一键输出宏介绍
- 群星.1996-红不让台语原唱2辑【福和唱片】【WAV+CUE】
- 郭书瑶.2009-爱的抱抱(EP)【种子音乐】【FLAC分轨】
- 郑瑞芬.1989-BE.MY.BABY【现代】【WAV+CUE】
- 花钱请人每周放30万只不咬人的蚊子 防治登革热传播
- 饭制《第一后裔》丧尸版弗蕾娜
- 贝克汉姆亲临!2024FC品类游戏嘉年华圆满落幕
- 「命轨爻错之翼」风之翼发放说明
- 《原神》前瞻特别节目回顾长图
- 米游币抽抽乐-原神专场现已开启!
- 黑鸭子2001《风情中国HQCD》[日本版][WAV+CUE]
- 陈杰洲1990-成人礼[滚石][WAV+CUE]
- MarkAanderud-HandsFree(2024)[24-44,1]FLAC
- 孙露《观心》1:1母盘直刻限量版[低速原抓WAV+CUE][361M]
- 钟志刚《汽车DJ玩主》[低速原抓WAV+CUE][1G]