python3魔法方法_python3魔法方法汇总

概述:

1.Python对象自带的一些被下划线包围的方法,我们称之为魔法方法,如果python对象重载了这些方法,那么我们可以某些情况下去使用它

2.魔法方法是python内置方法,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数。

__init__()

__init__()方法,在创建一个对象时默认被调用,不需要手动调用

__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去

classItem(object):#用于初始化类的操作和配合__new__

def __init__(self,name,price):

self.name=name

self.price=priceprint(self.name,self.price)deffoo(self):print('test')

it=Item('口罩',0.5)

it.foo()

__new__(cls[, …])

在第一次遇见__init__(self[,…])方法时我们会认为对象创建时第一个调用的方法就是它,其实不是。第一次调用的方法是__new__(cls[,…])。__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函数,创建并返回一个实例对象,如果__new__只调用了一次,就会得到一个对象。它的第一个参数是这个类,其他的参数是用来直接传递给__init__ 方法

classTestClass:def __init__(self):print("调用__init__")def __new__(cls, *args, **kwargs):

print(cls)print("调用__new__")return object.__new__(cls)#返回当前类的实例

t= TestClass()

__new__ 决定是否要使用该 __init__ 方法,因为__new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则__init__ 不会被调用。

classA:print('11111111')defchen(self):print('22222222222')classB(A):def __init__(self):print("调用__init__")def __new__(cls, *args, **kwargs):print("调用__new__")

a= object.__new__(cls)#返回父类的实例,不会调用__init__方法

#通过对象调用父类函数

a.chen()

t=B()classA:pass

classB(A):def __init__(self):print("调用__init__")def __new__(cls, *args, **kwargs):print("调用__new__")return object.__new__(A)#返回父类的实例,不会调用__init__方法

t= B()

__del__(self)

有了构造函数自然少不了析构函数。Python中__del__可以认为是析构函数了,在一个实例被销毁时它会执行。该方法是解释器自动调用的,一般情况下不重写。

classTestclass:def __new__(cls, *args, **kwargs):print("创建实例")return object.__new__(cls)def __init__(self):print("初始化实例")def __del__(self):print("销毁")print("自动调用del")

T= Testclass()

__str__(self)

当被 str() 调用时会执行__str__。此方法类似JAVA中的toString方法。

classA:def __init__(self,name):

self.name=nameclassB:def __init__(self,name):

self.name=namedef __str__(self):#重写__str__方法

returnself.name

a= A("Tom")print(a)

b= B("Jake")print(b)

__repr__()

该方法继承自object类。当创建我们用print打印对象时,会默认调用该方法得到我们关于类的信息,比如等,因此又称为自我描述方法。我们可以重写该方法在print的时候获取自己想要的信息,比如:

classItem:def __init__(self, name, price):

self.name=name

self.price=pricedef __repr__(self):return self.name + '--' +str(self.price)

it= Item('cat', 18.8)print(it)

str()与repr()的区别

在python中,str()与repr()都可以使实现类型的转换,而我们最常用的是str(),什么时候repr使用?

str():将值转化为适于人阅读的字符串的形式(给人看)

repr():将值转化为供解释器读取的字符串形式(给机器看)

##_____________________________________str实例_____________________________________________

classA(object):def __init__(self, name, age):

self.name=name

self.age=agedef __str__(self):return 'name:{},age:{}'.format(self.name,self.age)

my_list= [A('张三', 8), A('李四', 9)]print(my_list)#__________________________________repr实例___________________________________________

classA(object):def __init__(self, name, age):

self.name=name

self.age=agedef __repr__(self):return f'name:{self.name},age:{self.age}'my_list= [A('张三', 8), A('李四', 9)]print(my_list)

通过简单的对⽐,我们发现,直接输出对象,调⽤的__repr__ ⽅法。

另外还需要注意的是,如果将对象放在容器中进⾏输出,调⽤的是__repr__ ⽅法。

__dict__属性

该属性用于查看对象的属性,返回一个字典集合。

classItem:def __init__(self,name,price):

self.name=name

self.price=pricedeffoo(self):pass

defbar(self):

self.price=0.8

print(it.__dict__)

it=Item('口罩',0.5)print(it.__dict__)#打印字典集合

for k,v in it.__dict__.items():print(k,v)

it.bar()#调用bar方法

__doc__属性 和__name__属性

__doc__用于查看说明文档。python的说明文档接着写在类名下面就可以了。

__name__用于查看实例方法或类

classFoo(object):"""描述类信息,可被自动收集"""

deffunc(self):'''实例方法描述'''

print('11111111111')print(Foo.__doc__)#打印类的说明文档

print(Foo.func.__doc__)#打印类方法描述

print(Foo.func.__name__)#打印实例方法名称

__call__()

Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。

换句话说,我们可以把这个类型的对象当作函数来使用,相当于 重载了括号运算符。

classCog(object):#__init__创建完对象后会自动被调用(用于初始化类)

def __init__(self):print("----init方法-----")#__call__作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(直接对象()调用)

def __call__(self):return '调用__call__'xtq=Cog()print(xtq())#直接使用对象()调用__call__

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值