python中的魔法方法相当于_Python中的魔法方法

Python中,在名字后面和前面加上双下划线表示魔法方法。如果类实现了这些方法中的某一个,那么Python就会在特殊情况下调用这个函数。这些函数几乎不被用户直接调用。

1.构造方法

Python中__init__()被当作构造方法。同时Python中还有个__del__()的魔法方法,也就是析构方法,它是在对象被垃圾回收回收之前调用。子类的初始化方法一般都要初始化父类的成员,可以通过两种方案完成:一是调用未绑定的超类的构造方法;二是通过super函数调用,调用super函数时需要将当前类和当前类的对象(可命名为self)作为参数,super函数返回超类,然后通过返回的超类调用超类的构造方法。

class Bird:

def __init__(self):

self.hungry = False

def eat(self):

if(self.hungry):

print ('Eating')

else:

print ('No thanks')

#实现方案1

class SingBird(Bird):

def __init__(self):

Bird.__init__(self) #直接调用未超类绑定的构造方法

def sing(self):

print ('Singing')

#实现方案2

class SongBird(Bird):

def __init__(self):

super(SongBird,self).__init__() #利用super函数返回超类

def sing(self):

print ('Singing')

bird = SongBird()

bird.eat()

bird.hungry = True

bird.eat()

【注】未绑定的构造方法指直接通过类名调用方法。

【注】判断一个数是否是整数的代码:if not isinstance(key,(int,long))  ##判断key是不是整数。

2.基本定制

__init__(self,arg1,...)构造器

__new__(self,arg1,...)构造器

__del__(self)解构器

__str__(self)可打印字符的输出,内建str()及print语句

__repr__(self)运行时的字符串输出,内建repr()和操作符

__unicode__(self)内建unicode()

__call__(self,*args)表示可调用的实例

__nonzero__(self)为object定义False值;内建bool

__len__(self)内建len()

class A:

def __init__(self):

print ('call __init__')

def __str__(self):

print ('call __str__')

return 'call __str__'

def __len__(self):

print ('call __len__')

return 1

def __nonzero__(self):

print ('call __nonzero__')

a = A()

print (a)

print (len(a))

0818b9ca8b590ca3270a3433284dd417.png

【注】__new__和__init__的区别,__new__是创建对象时调用,需要控制一个对象的创建时使用__new__,而__init__创建完对象后调用,对当前的对象就行一些初始化的工作,无返回值,需要控制一个实例初始化。可以这样理解,默认创建是__new__,然后再调用__init__。

【注】__new__的时候,self还不存在;而调用__init__的时候,self已经存在。

3.对象值比较

__cmp__(self,obj)对象比较,内建cmp()

__lt__(self,obj)小于/小于或等于,对应于

__le__(self,obj)

__gt__(self,obj)大于/大于或等于,对应于>或>=

__ge__(self,obj)

__eq__(self,obj)等于/不等于,对应于==或!=

__ne__(self,obj)

class A():

def __init__(self,value=0):

self.value = value

def __lt__(self,obj):

print ('call __lt__')

return self.value < obj.value

def __gt__(self,obj):

print ('call __gt__')

return self.value > obj.value

a1 = A(1)

a2 = A(2)

print (a1

print (a2>a2)

0818b9ca8b590ca3270a3433284dd417.png

4.属性操作

__getattr__(self,attr)获取属性,内建getattr(),仅当属性没有找到时调用。

__getattribute__(self,attr)获取属性,内建getattr(),总是被调用。

__setattr__(self,attr,val)设置属性

__delattr__(self,atrr)删除属性

__get__(self,attr)(描述符)获取属性

__set__(self,atrr,value)(描述符)设置属性

__delete__(self,attr)(描述符)删除属性

class A():

def __init__(self,value=0):

self.value = value #会调用__setattr__设置value属性

def __getattr__(self,name):

print ('call __getattr__')

try:

return self.__dict__(name)

except:

return 'not found'

def __setattr__(self,name,value):

print ('call __setattr__')

self.__dict__[name] = value

a = A()

print (getattr(a,'value'))

print (getattr(a,'name'))

0818b9ca8b590ca3270a3433284dd417.png

5.数值及二进制

__*add__(self,obj) +操作符

__*sub__(self,obj) -操作符

__*mul__(self,obj) *操作符

__*div__(self,obj) /操作符

__*truediv__(self,obj) True除,/操作符

__*floordiv__(self,obj) Floor除,//操作符

__*mod__(self,obj) %操作符

__*divmod__(self,obj) 除和去模

__*pow__(self,obj,mod) 乘幂,内建pow,**操作符

__*lshift__(self,obj)左移位,<

__*rshift__(self,obj)右移,>>

__*and__(self,obj)按位与,&

__*or__(self,obj)按位或,|

__*xor__(self,obj)按位异或,^

__neg__(self) 一元负

__pos__(self) 一元正

__abs__(self)绝对值,内建abs()

__invert__(self)按位求反,~

__complex__(self,com)转换为complex,内建complex

__int__(self)转换为int,内建int()

__long__(self)转换为long,内建long()

__float__(self)转为float,内建float()

__oct__(self)八进制,内建oct()

__hex__(self)十六进制,内建hex()

__coerce__(self,num)压缩成同样的数值类型,内建coerce()

__index__(self)压缩可选的数值类型

6.序列

__len__(self)序列中的数目

__getitem(self,index)得到单个序列元素

__setitem__(self,index,value)设置序列中index的元素

__delitem__(self,index)删除单个序列元素

__getslice__(self,index1,index2)得到序列片段

__setslice__(self,index1,index2,value)设置序列片段

__delslice__(self,index1,index2)删除序列片段

__contains__(self,value)测试序列成员,内建in

__*add__(self,obj)串联,+操作符

__*mul__(self,obj)重复,*操作符

__iter__(self,obj)创建迭代器,内建iter

class A():

def __init__(self):

print ('call __init__')

self.value = [1,2,3,4,5,6]

def __len__(self):

print ('call __len__')

return len(self.value)

def __getitem__(self,index):

print ('call __getitem__')

return self.value[index]

def __setitem__(self,index,value):

print ('call __setitem__')

self.value[index] = value

a = A()

print (len(a))

print (a[2])

a[2]= 99

0818b9ca8b590ca3270a3433284dd417.png

7.映射

__len__(self)mapping中的项的数目

__hash__(self)散列函数值

__getitem__(self,key)得到给定键(key)的值

__setitem__(self,key,value)设定给定键(key)的值

__delitem__(self,key)删除给定键(key)的值

__missing__(self) 给定键如果不在字典中,则提供一个默认值。

7.参考

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值