- _setitem_() 和 _setattr_()的区别
- _getitem_() 和 _getattr_()的区别
1. _setitem_() 和 _setattr_()的区别
_setitem_ 是所有属性赋值时的内置初始语句, 若要自定义对象属性赋值方式则使用该方法
_setattr_是字典类型赋值时的内置初始语句, 若要自定义类似字典的赋值方式则使用该方法
示例:
class Method(object):
def __setattr__(self, key, value):
print('调用了setattr')
self.__dict__[key] = value
def __setitem__(self, key, value):
print('调用了setitem')
self.__dict__[key] = value
def __delitem__(self, key):
del self.__dict__[key]
m = Method()
m.age = 1 # 调用__setattr__ 方法
# m['name'] = 'tom' # 调用 __setitem__ 方法
# del m['name']
print(m.__dict__)
# 若注释__setattr__方法则使用的是初始Method类自带的__setattr__方法
2. _getitem_() 和 _getattr_()的区别
同上get就是获取对象属性的方法, _getattr_也是很多设计模式的一种灵活应用
比如懒加载, 动态导入模块.
示例:
class Student:
def __getattr__(self, item):
return item + 'set a new value'
def __getitem__(self, item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
s = Student()
print(s.name) # 调用__getattr__方法 输出'name set a new value'
s.name = 'billy'
print(s.name) # name 已存在 不调用__getattr__方法
s.age = 18 # 调用__setattr__ 方法
print(s.age)
print(s['age']) # 调用 __getitem__方法 输出18
s['name'] = 'billy' # 调用 __setitem__ 方法
print(s['name']) # 调用 __getitem__ 方法 输出 'billy'
网友评论