python创建实例会调用哪些魔术方法_python之面向对象之魔术方法

一,魔术方法(魔术方法,特殊方法)https://www.cnblogs.com/nmb-musen/p/10861536.html

1,__init__作用

在创建对象的时候自动调用对 创建的对象 进行初始化设置

2,什么是魔术方法

在python中像__init__这类双下划线开头和结尾的方法,称之为魔术方法

注意:魔术方法都是python内部定义的,自己不要去定义__init__这种双下划线开头的方法

3,创建一个对象的时候,调用的第一个方法是什么?

__new__方法,创建并返回一个实例对象(存在于父类object中),创建的实例对象让init函数初始化

python创建实例会调用哪些魔术方法_python之面向对象之魔术方法_第1张图片

在重写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调式用的,接近对象创建的内容

python创建实例会调用哪些魔术方法_python之面向对象之魔术方法_第2张图片

使用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__触发机制

python创建实例会调用哪些魔术方法_python之面向对象之魔术方法_第3张图片

总结:

使用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('---原来的功能函数---')

你可能感兴趣的:(python创建实例会调用哪些魔术方法_python之面向对象之魔术方法)