| 七、__setitem__, __getitem__, __delitem__ |
当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而进行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。
__getitem__(self,key):返回键对应的值
__setitem__(self,key,value):设置给定键的值
__delitem__(self,key):删除给定键对应的元素
class Foo: def __init__(self, name): self.name = name def __getitem__(self, item): # print('getitem...') #print(item) return self.__dict__.get(item) # 字典get方法有则取值,无也不会报错 def __setitem__(self, key, value): # print('setitem...') # print(key,value) self.__dict__[key] = value def __delitem__(self, key): # print('delitem...') # print(key) # self.__dict__.pop(key) del self.__dict__[key] obj = Foo('egon') # 1、查看属性 # obj.属性名 # item系列就是为了把对象模拟成像字典一样,就可以像字典一样访问 obj['name'] # 以这种形式完成 obj.name取值的效果 """ getitem... name """ print(obj['name']) # 2、设置属性 # obj.sex = 'male' obj['sex'] = 'male' print(obj.__dict__) print(obj.sex) # 3、删除属性 # del obj.name del obj['name'] print(obj.__dict__) """ {'sex': 'male'} """
| 八、__str__, __repr__, __format__ |
改变对象的字符串显示__str__,__repr__
自定制格式化字符串__format__
d = dict({'name' : 'egon'})
print(isinstance(d, dict)) # True,d是dict类的实例
print(d)
class Foo:
pass
obj = Foo()
print(obj)
""" 同样是打印对象,显示形式完全不同,打印总是希望像前一种有提示功能。
{'name': 'egon'}
<__main__.Foo object at 0x10401ad68>
"""
# __str__方法定义后,会在打印对象的时候,触发这个对象下的__str__方法,把字符串的结果作为打印的结果
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self): # 必须return一个字符串
# print("触发__str__方法:")
return '<name:%s,age:%s>' %(self.name, self.age)
obj = People('egon', 18)
print(obj)
"""
<name:egon,age:18>
"""