一,魔术方法(魔术方法,特殊方法)https://www.cnblogs.com/nmb-musen/p/10861536.html
1,__init__作用
在创建对象的时候自动调用对 创建的对象 进行初始化设置
2,什么是魔术方法
在python中像__init__这类双下划线开头和结尾的方法,称之为魔术方法
注意:魔术方法都是python内部定义的,自己不要去定义__init__这种双下划线开头的方法
3,创建一个对象的时候,调用的第一个方法是什么?
__new__方法,创建并返回一个实例对象(存在于父类object中),创建的实例对象让init函数初始化
在重写new方法时,一定要调用父类的new方法来完成对象的创建,并且将对象返回
class MyClass(object): def __init__(self, name): self.name = name print('__init__方法调用了') def __new__(cls, *args, **kwargs): print('这个是new方法') # 第一种 调用父类方法并返回 # return super().__new__(cls) # 第二种,调用父类object return object.__new__(cls) m = MyClass('小鱼') print(m.name)
4,这个__new__方法有什么作用?又在什么时候会调用呢?
单例模式中会用到
二,单例模式
需求:类每次实例化的时候都会创建一个对象,如果要求类只能实例化一次该怎么做?
class MyTest(object): # 设置一个类属性用来记录这个类有没有创建过对象 instance = None def __new__(cls, *args, **kwargs): if not cls.instance: cls.instance = object.__new__(cls) return cls.instance else: return cls.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返回的必须是一个字符串对象
class MyTest: def __init__(self, name): self.name = name def __str__(self): print('__str__方法被触发了') return self.name def __repr__(self): print('__repr__方法被触发了') return '<MyTest.obj-{}>'.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__方法
class Decorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): print('这是装饰器里面的功能') self.func() # test = Decorator(test) # 1,相当于创建了一个对象,赋值给test # 2,test()相当于调用对象,对象如果可以被调用,通过call方法实现 # 3,创建Decorator对象时传进去的函数会被init方法接收 @Decorator def test(): print('---原来的功能函数---')