当前位置: 首页 > 后端技术 > Python

常见的面向对象魔术方法合集

时间:2023-03-25 19:52:56 Python

最近发现同学们的问题是一致的,都是在问我一些魔术方法的用途和意义,所以这里也收录了魔术的详解和用法方法给你。众所周知,方法是需要调用执行的,而魔术方法则不同。它不需要您的调用,它会在特定时间自行执行。__init__方法__init__方法是类创建实例时默认调用的方法。在此方法中定义的属性称为初始化属性。classPerson(object):def__init__(self):print('Hieveryone,IamIamZhaZhahui')p1=Person()...执行结果:大家好,我是ZhaZhahui__new__method大家刚刚看到效果看到这个__init__方法,你肯定会认为这个方法是类中第一个执行的方法。事实上,它不是。我们的类首先调用__new__方法,它的第一个参数是它的类对象,其他参数都传给__init__方法,而_new__方法可以调用其他类的方法或者返回其他实例作为当前类的实例,所以如果__new__方法没有返回实例,那么__init__方法就不会被调用,所以__new__方法决定是使用__init__方法,还是通过__new__方法创建实例。__new__方法的主要目的是为您提供一种在继承某些不可更改的属性时对其进行修改的方法。classPerson(int):def__new__(cls,value):returnsuper(Person,cls).__new__(cls,abs(value))p1=Person(-1)print('p1=',p1)执行结果:p1=1__str__方法__str__方法用于显示信息,通常用于返回一个字符串作为实例对象的描述信息。它只有一个参数,需要返回一个数据。当你在类外打印时,实例化一个对象时会打印这个数据,使用print(object)或str(object)时会触发这个方法。classPerson(object):def__init__(self):self.name='炸炸灰'self.age=18def__str__(self):return'我是%s,今年是%s,快来杀了我'%(self.name,self.age)p1=Person()print(p1)执行结果:我是渣渣辉,今年18岁,快来砍我吧。当我使用print()函数输出对象名称时,默认会打印对象名称所引用的内存地址,如果要打印对象的属性值,可以使用__str__(self)方法.__call__方法__call__方法可以是类的实例对象,可以像调用函数一样使用该对象。它的作用是简化对象下方法的使用,模糊对象和函数调用的区别。classPerson(object)beforeusing__call__:defdemo(self):print('p1')p1=Person()p1.demo()执行结果:p1afterusing__call__classPerson(object):def__call__(self):print('p1')p1=Person()p1()执行结果:p1使用__call__方法实现斐波那契数列classFibonacci(object):def__call__(self,num):a,b=1,1self.LST=[]ifnum<=2:Self.lst.append(a)Self.lst.append(B)Else:forIinRange(1,NUM+1):Self.lst.append(a)a,b=b,a+breturnself.lstfibo=Fibonacci()ret=fibo(10)print(ret)执行结果:[1,1,2,3,5,8,13,21,34,55]__dir__方法熟悉python的人都知道dir()方法可以让我们查看当前环境中有哪些方法和属性可用。通过dir(object),我们可以获得一个对象拥有的方法和属性。同理,如果我们自己在类中定义了这个__dir__方法,我们可以指定一些其他人可以调用的方法,你的合作开发者可以通过调用dir()方法来查看和使用。classPerson(object):def__init__(self):self.name='炸炸灰'self.age=18self.gender='男'defchuanqi(self):print('来跟我砍传奇')p1=Person()print(dir(p1))执行结果:['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','age','chuanqi','gender','name']__del__方法当实例被销毁时,__del__方法会被执行,this方法由解释器自动调用,一般不需要重写。classPerson(object):def__del__(self):print("Destroy")print("Autocalldel")p1=Person()执行结果:当我们访问一个不存在的属性时,Destroy自动调用del__getattr__方法这个方法被调用,如果属性存在则不调用。如果我们不覆盖__getattr__方法,当我们访问一个不存在的属性时将抛出一个AttributeError。classPerson(object):def__init__(self,name):self.name=namedef__getattr__(self,item):print("不存在的属性")returnitem1=Person("渣追")print(p1.name)print(p1.age)#ageattributedoesnotexist执行结果:查查灰中不存在属性age__setattr__方法所有的属性设置都会调用这个方法,只有拥有这个魔法方法的对象才能设置属性,使用这个方法应该是注意不要在循环中调用。类Person(object):def__init__(self,name):self.name=namedef__setattr__(self,name,value):print("execute__setattr__")object.__setattr__(self,name,value)p1=Person("Zhazhahui")print(p1.name)执行结果:执行__setattr__Zhazhahui__dict__方法__dict__方法可以认为是一个管理系统,它管理类中存储的各种属性,当我们创建类属性或实例属性时,我们会保存这些信息在__dict__魔术方法里面,然后在我们使用它的时候把它取出来。当我们在实例对象上使用__dict__方法时,我们可以读取当前实例对象的属性。classPerson(object):def__init__(self):self.name='炸渣灰'self.age=18self.gender='男'p1=Person()print(p1.__dict__)执行结果:{'name':'zhazhahui','age':18,'gender':'male'}__eq__方法在做对象比较时,我们实际调用的方法是__eq__方法,默认比较的是内存地址,如果你想更改比较方法,可以覆盖__eq__方法。类人(对象):def__init__(自我,姓名,年龄):self.name=nameself.age=agedef__eq__(self,other):returnself.__dict__==other.__dict__per1=Person('lee'10)per2=Person('lee',10)print(per1==per2)print(per1isper2)执行结果:TrueFalse这些是我们经常用到的魔术方法,希望大家有所收获,记得献上你的小红心!!!