面向对象之魔术方法
在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,这边给大家把所有的魔术方法汇总了一下,希望对大家的学习有所帮助。
1、__new__方法
__new__ 是在一个对象实例化的时候所调用的第一个方法
class MyClass(object): def __init__(self,name): self.name=name def __new__(cls, *args, **kwargs): print("这是new方法") # return super().__new__(cls) #调用父类的new方法进行对象实例化 return object.__new__(cls) m=MyClass('test') print(m.name)
运行结果:
这是new方法
test
使用__new__方法实现单例模式
class MyClass(object): _instance=None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance=object.__new__(cls) return cls._instance m1=MyClass() m1.name="test" m2=MyClass() m2.name='test1' m3=MyClass() m3.age=18 print(id(m1)) #4463655848 print(id(m2)) #4463655848 print(id(m3)) #4463655848 print(m1.name) #test1 print(m3.age) #18
2、__str__和__repr__方法
class MyClass(object): def __init__(self,name): self.name=name def __str__(self): print("调用__str__方法") return self.name #返回值必须为字符串 def __repr__(self): print("调用__repr__方法") return "My_object:{}".format(self.name) #返回值必须为字符串 m=MyClass("musen") print(m.name) print("------------") print(str(m)) print("------------") print(repr(m))
运行结果:
musen ------------ 调用__str__方法 musen ------------ 调用__repr__方法 My_object:musen
总结:
使用str函数或print打印对象时,会优先调用自身的str方法,没有str方法时,会调用repr方法,如果两个方法都没有,会去找父类的str方法
使用repr方法或交互环境下输出变量,会找自身的repr方法,如果自身没有repr方法,会找父类的repr方法
注意点:
重写__str__和__repr__方法时,必须记得写return,return返回的必须是一个字符串对象。
3、__call__方法
想让类创建出来的对象,像函数一样被调用,可以在类里面定义__call__方法。
class MyClass(): def __init__(self,name): self.name=name def __call__(self): print("调用了call方法") m=MyClass("test") m() # 运行结果:调用了call方法
通过__call__方法用类实现装饰器
#类实现装饰器 class Deractor(): def __init__(self,func): self.func=func def __call__(self,*args,**kwargs): print("这是装饰器里面的第一个功能") result=self.func() print("这是装饰器里面的第二个功能") return result @Deractor def test_01(): #test_01=Deractor(test_01) print("—————原来的功能函数——————————") return 'haha' res=test_01() print(res)
运行结果:
这是装饰器里面的第一个功能
—————原来的功能函数——————————
这是装饰器里面的第二个功能
haha
4、算术相关的方法
__add__(self,other):定义加法的行为 +
__sub__(self,other): 定义减法的行为 -
class MyStr(): def __init__(self,data): self.data=data def __str__(self): return self.data def __add__(self,other): return self.data+other.data def __sub__(self,other): return self.data.replace(other.data,'') s1=MyStr("ssss111") s2=MyStr("ssss222") print(s1) # ssss111 print(s2) # ssss222 s3=MyStr(s1+s2) print(s3) # ssss111ssss222 print(s3-s1) # ssss222
posted on 2020-08-24 10:15 crystal1126 阅读(142) 评论(0) 编辑 收藏 举报