【python】类的特殊成员
- 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用。无论人或事物往往都有不按套路出牌的情况,Python的类成员也是如此,存在着一些具有特殊含义的成员,详情如下:
__init__ 类()自动执行
__del__
__call__ 对象(),类()() 自动执行
__int__ int(obj)
__str__ str(obj)
__add__
__dict__ #将对象中封装的所有内容通过字典的形式返回
__getitem__ 切片或者索引
__setitem__
__delitem__
__iter__
如果类中有__iter__方法,对象===》》可迭代对象
对象.__iter__() 的返回值:迭代器
for循环,迭代器,next方法
for循环,可迭代对象,对象.__iter__() ,迭代器,next方法
1、执行Li对象的类Foo类中的__iter__方法,并获取其返回值
2、循环上一步中返回的对象
- 1.call,对象后面加括号,触发执行。
class Foo:
def __init__(self):
print('init')
def __call__(self, *args, **kwargs):
print('call')
obj = Foo()
obj() #对象()自动执行__call__方法
- 2.str,如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return '%s-%s'%(self.name,self.age)
obj = Foo('xwl',23)
print(obj) #print(str(obj))--->>str(obj)--->>obj中的__str__,并获取返回值
- 3.dict,类或对象中的所有成员
class Foo:
"""
描述
"""
def __init__(self,name,age):
self.name = name
self.age = age
obj = Foo('xwl',18)
b = obj.__dict__ # {'name': 'xwl', 'age': 18}
print(b)
ret = Foo.__dict__
print(ret)
#{'__module__': '__main__', '__doc__': '\n 描述\n ',
# '__init__': <function Foo.__init__ at 0x000002AA9219C820>, '__dict__': <attribute '__dict__' of 'Foo' objects>,
# '__weakref__': <attribute '__weakref__' of 'Foo' objects>}
-4.getitem、setitem、delitem,用于索引操作,如字典。以上分别表示获取、设置、删除数据
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self, item):
return item+10
def __setitem__(self, key, value):
print(key,value)
def __delitem__(self, key):
print(key)
Li = Foo('xwl',18)
r = Li[1] #自动执行Li对象中的__getitem__方法
print(r) # 11
Li[100] = 'dasdfd' #自动执行Li对象中的__setitem__方法 # 100 dasdfd
del Li[999] #自动执行Li对象中的__delitem__方法 # 999
- 5.iter ,用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 iter
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def __iter__(self):
return iter([11,22,33,44])
Li = Foo('xwl',18)
#如果类中有__iter__方法,对象===》》可迭代对象
#对象.__iter__() 的返回值:迭代器
#for循环,迭代器,next方法
#for循环,可迭代对象,对象.__iter__() ,迭代器,next方法
#1、执行Li对象的类Foo类中的__iter__方法,并获取其返回值
#2、循环上一步中返回的对象
for i in Li:
print(i)