Python-魔术方法

魔术方法(特殊方法)

__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方法
作用: __str__方法是给用户看的 __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()

 

上一篇:Java反射


下一篇:MATCHED 用法