一,魔术方法(魔术方法,特殊方法)https://www.cnblogs.com/nmb-musen/p/10861536.html
1,__init__作用
在创建对象的时候自动调用对 创建的对象 进行初始化设置
2,什么是魔术方法
在python中像__init__这类双下划线开头和结尾的方法,称之为魔术方法
注意:魔术方法都是python内部定义的,自己不要去定义__init__这种双下划线开头的方法
3,创建一个对象的时候,调用的第一个方法是什么?
__new__方法,创建并返回一个实例对象(存在于父类object中),创建的实例对象让init函数初始化
在重写new方法时,一定要调用父类的new方法来完成对象的创建,并且将对象返回
classMyClass(object):def __init__(self, name):
self.name=nameprint('__init__方法调用了')def __new__(cls, *args, **kwargs):print('这个是new方法')#第一种 调用父类方法并返回
#return super().__new__(cls)
#第二种,调用父类object
return object.__new__(cls)
m= MyClass('小鱼')print(m.name)
4,这个__new__方法有什么作用?又在什么时候会调用呢?
单例模式中会用到
二,单例模式
需求:类每次实例化的时候都会创建一个对象,如果要求类只能实例化一次该怎么做?
classMyTest(object):#设置一个类属性用来记录这个类有没有创建过对象
instance =Nonedef __new__(cls, *args, **kwargs):if notcls.instance:
cls.instance= object.__new__(cls)returncls.instanceelse:returncls.instance
t1=MyTest()
t1.name= '小鱼't2=MyTest()print(t2.name)
# t1和t2对象的内存地址是一样的print(id(t1) == id(t2))
装饰器实现单例模式
1,python的内置函数__str__,__repr__,format
一般str方法是给用户看的,repr调式用的,接近对象创建的内容
使用print打印时触发__str__方法
交互环境直接输入变量时触发的时__repr__方法
注意点:
重写__str__ __repr__方法时必须要记得写return
重写__str__ __repr__方法时,return返回的必须是一个字符串对象
classMyTest:def __init__(self, name):
self.name=namedef __str__(self):print('__str__方法被触发了')returnself.namedef __repr__(self):print('__repr__方法被触发了')return ''.format(self.name)
t1= MyTest('小鱼')#调用__str__方法
print(t1)#调用__repr__方法
res =repr(t1)print(res)
内置函数str转换一个对象时,触发对象对应__str__方法
内置函数format处理对象时,触发对象对应__str__方法
内置函数repr函数,触发对象的__repr__的方法
__str__和__repr__触发机制
总结:
使用str函数或者print打印对象时会优先触发str方法,没定义str方法的情况下,会再去找repr方法,如果都没有,那么会去找父类的str方法
使用repr方法或者交互环境下输入变量,会先找自身的repr方法,自身没有repr方法,会再去找父类额repr方法
2,__call__方法
在python中万物皆对象,那为甚函数可以被调用,其他对象却不能被调用?
通过类实现装饰器要用到__call__方法
classDecorator:def __init__(self, func):
self.func=funcdef __call__(self, *args, **kwargs):print('这是装饰器里面的功能')
self.func()#test = Decorator(test)#1,相当于创建了一个对象,赋值给test#2,test()相当于调用对象,对象如果可以被调用,通过call方法实现#3,创建Decorator对象时传进去的函数会被init方法接收
@Decoratordeftest():print('---原来的功能函数---')