标签:可调用对象 它的 __new__ pass 无效 通过 add __init__ 继承
__init__
、__repr__
等等,在类中使用它们时往往较少的代码就可以发挥很大的作用,提高开发效率,因此在 Python 中称这些方法为“魔法方法”
__init__
方法,它可以用于新建实例对象的时候给对象绑定属性,但是在新建对象的时候第一个调用的不是__init__
方法,而是 __new__(cls, [...])
方法,这两个方法的区别在于1.__init__
方法是在实例对象创建完成后调用的,主要用于设置实例对象的初始值,它的第一个参数为 self
,可以不需要返回值
2. __new__
方法是在实例对象被创建之前调用的,主要用于创建实例对象并返回实例对象,它的第一个参数为 cls
,它只会取 cls
参数,其余参数都传给了 __init__
方法,必须要有返回值可以是 super().__new__(cls)
或是 object.__new__(cls)
# 作者:伊洛Yiluo 公众号:伊洛的小屋
# 个人主页:https://yiluotalk.com/
# 博客园:https://www.cnblogs.com/yiluotalk/
In [1]: class People:
...: def __new__(cls, name):
...: print(‘__new__‘)
...: return super(People, cls).__new__(cls)
...: def __init__(self, name):
...: print(‘__init__‘)
...: self.name = name
...: def __del__(self):
...: print(‘__del__‘)
...:
In [2]: man = People(‘Yiluo‘)
__new__
__init__
In [3]: man.name
Out[3]: ‘Yiluo‘
In [4]: del man
__del__
__slots__
变量,可以绑定的属性值以元组的形式赋予给它。需要注意的是:__slots__
的作用只在定义的类中有效,在继承该类的子类中是无效的。如果想要在子类中限制属性则需要重新定义,重新定以后,父类中的__slots__
则会被子类继承>>> class People:
... __slots__ = (‘name‘, ‘age‘)
...
>>> somebody = People()
>>> somebody.name = ‘Yiluo‘
>>> somebody.age = 18
>>> somebody.name
‘Yiluo‘
>>> somebody.age
18
>>>
>>> class Man(People):
... __slots__ = (‘city‘)
...
>>> person = Man()
>>> person.name = ‘Yiluo‘
>>> person.age = 18
>>> person.address = ‘shenzhen‘
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘Man‘ object has no attribute ‘address‘
>>> person.city = ‘shenzhen‘
>>> person.name
‘Yiluo‘
>>> person.age
18
>>> person.city
‘shenzhen‘
__getattribute__
和 __getattr__
__getattribute__
方法,如果没有该属性就会报 AttributeErro
r 错误,这个时候可以考虑使用 __getattr__
方法进行自定义__call__
callable()
函数来判断一个对象是否是可调用对象>>> class People:
... pass
...
>>> person = People()
>>> callable(person)
False
>>> callable(People())
False
>>> callable(People)
True
>>>
>>> class People:
... def __call__(self):
... print(‘__call__‘)
...
>>> person = People()
>>> person()
__call__
>>> callable(person)
True
__iter__
和 __next__
__iter__
方法就可以让类成为一个可迭代对象,如果使用 for 循环遍历类对象还需要在类中定义__next__
方法,在__next__
方法中可以定义取值的规则,当超出取值规则会抛出 StopIteration
异常从而退出当前循环#!/usr/bin/env python3
class Test:
def __init__(self, data=0):
self.data = data
def __iter__(self):
return self
def __next__(self):
if self.data > 5:
raise StopIteration
else:
self.data += 1
return self.data
for i in Test():
print(i)
? code python3 demo.py
1
2
3
4
5
6
标签:可调用对象 它的 __new__ pass 无效 通过 add __init__ 继承
原文地址:https://www.cnblogs.com/yiluotalk/p/13582895.html