Python常用魔术方法
文章目录
- 1 魔术方法之__new__()和__init__()的用法
- 2 魔术方法之__iter__()和__next__()的用法
- 3 魔术方法之__call__()的用法
1 魔术方法之__new__()和__init__()的用法
Python通过__new__()方法实现类的实例化,返回对象,再调用__init__()对类属性初始化;new()方法是实例创建时执行的,而构造方法__init__()是实例创建后执行的
__new__()解析:
- __new__()方法是Python新式类(py2既有新式类也有经典类、py3统一为新式类;py2中的新式类需要显示继承object)引入的
- __new__()用于控制生成一个新实例的过程。是类级别的静态方法,在创建实例对象时执行,如果自定义类中没有重写该方法,则Python自动调用父类的方法,当所有父类也没有重写定义该方法时,则直接调用object类的__new__()方法。
""" test """class MyTest:""""""def __new__(cls, *args, **kwargs):print("__new__被调用!")result = super().__new__(cls)return resultdef __init__(self, name, age):print("__init__被调用!")self.name = nameself.age = agemytest = MyTest('kobe', '18')### 打印内容如下 ###
"""
__new__被调用!
__init__被调用!
"""
2 魔术方法之__iter__()和__next__()的用法
类中定义__iter__(),表示这个类是一个迭代器,它只在迭代开始的时候运行一次,经常与__next__()方法一起使用
""" test """class MyList:""""""def __init__(self, num):self.num = numself.start = -1def __iter__(self):print("__iter__被调用!")return selfdef __next__(self):print("__next__被调用!")self.start += 1if self.start > self.num:raise StopIterationreturn self.startx = MyList(5)
for i in x:print(i)### 打印内容如下 ###
"""
__iter__被调用!
__next__被调用!
0
__next__被调用!
1
__next__被调用!
2
__next__被调用!
3
__next__被调用!
4
__next__被调用!
5
__next__被调用!
"""
3 魔术方法之__call__()的用法
实现对象可调用(实例化的对象加括号后,调用__call__()方法)
""" test """class MyTest:""""""def __init__(self, name, age):print("__init__被调用!")self.name = nameself.age = agedef __call__(self, *args, **kwargs):print("支持被调用!")return self.namemytest = MyTest('kobe', '18')
mytest()### 打印内容如下 ###
"""
__init__被调用!
支持被调用!
"""