魔术方法(特殊方法)
__init__有什么作用?- 在创建对象的时候,自动调用时,创建的对象 进行初始化设置的
- 在python中像__init__这类双下划线开头和结尾的方法,我们把它统称为魔术方法
- 注意:魔术方法都是python内部定义的,自己不要去定义__init__这种双下划线开头的方法
1、__new__方法
__new__方法创建对象调用1 # 在重写new方法的时候,一定要调用父类的new方法,来完成对象创建,并且将对象返回出去 2 class Test(object): 3 # 参数cls代表类的本身 4 def __new__(cls,*args,**kwargs): 5 return object.__new__(cls)
2、单例模式
类只能被实例化一次对象1 # 单例模式 2 class MyTest(object): 3 __instance = None # 设置类私有属性,用来记录该类是否有创建过对象 4 5 def __new__(cls,*args,**kwargs): 6 if not cls.__instance: 7 cls.__instance = object.__new__(cls) 8 return cls.__instance 9 else: 10 return cls.__instance 11 12 t = MyTest() 13 t1.name = 'Alan' 14 t1 = MyTest() # t1即可访问也可修改t的属性 # 作用:可节约内存 15 print(t1.name) # 结果 >>> Alan id值与t1id值相同通过装饰器实现单例模式,只要任意一个类使用该装饰器装饰,那么久会变成一个单例模式的类
1 # 单例模式装饰器 2 def single(cls): 3 instance = {} 4 def fun(*args, **kwargs): 5 if cls in instance: 6 return instance[cls] 7 else: 8 instance[cls] = cls(*args, **kwargs) 9 return instance[cls] 10 return fun 11 12 @single 13 class Test: 14 pass
3、__str__方法和__repr__方法
# 使用print打印触发的是__str__方法 >>> a = 'abc' >>> print(a) abc # 交互环境下输入变量的时候触发的是__repr__方法 >>> a 'abc'Python的内置函数str和repr,format
- 内置函数str转换一个对象时,触发对象对应__str__方法
- 内置函数format处理对象时,触发对象对应__str__方法
- 内置函数repr函数,触发对象的__repr__方法
1 class MyTest(object): 2 3 def __init__(self, name): 4 self.name = name 5 6 def __str__(self): 7 return "调用了str方法" 8 9 def __repr__(self): 10 return "调用了repr方法" 11 12 m = MyTest("Alan") 13 print(m) # >>> 调用了str方法 14 str(m) # >>> 调用了str方法 15 format(m) # >>> 调用了str方法 16 17 repr(m) # >>> 调用了repr方法注意点:
- 重写__str__和__repr__方法时,必须记得写return
- 重写__str__和__repr__方法时,return返回的必须是一个字符串对象
- 使用str函数或者print打印对象时会先优先触发str方法,没定义str方法的情况下,会再去找repr方法,如果都没有,那么就会去找父类的str方法
- 使用repr方法或者交互环境输入变量,会先找自身的repr方法,自身没有repr方法,会再去找父类的repr方法
4、__call__方法
类创建出来的对象,像函数一样被调用 作用:对象像函数一样调用触发1 class MyTest(object): 2 3 def __init__(self, name): 4 self.name = name 5 6 def __call__(self, *args, **kwargs): 7 print("-——call————") 8 9 m = MyTest() 10 m() # >>> 调用了call方法通过__call__方法用类实现装饰器;即可装饰函数,也可装饰类
1 # 类实现装饰器 2 class Decorator: 3 4 def __init__(self, func): 5 self.func = func 6 7 def __call__(self, *args, **kwargs) 8 self.func() 9 10 @Decorator # test = Decorator(test) 11 def test(): 12 print("这是功能函数") 13 14 test()