class 通过内置成员_ dict _ 存储成员信息包括自己(_ dict _ 字典)通过dir函数可以查看该dict,当类实例成员属性发生变动时,会调用 _ setattr _ ,在这个方法下必须进行对属性的赋值操作 self._ dict_ [name] = value。若不进行定义 ,如下的self.name = obj[‘name’]语句将无任何意义,若在class中未显式定义 _ setattr __,解释器会默认执行该赋值语句。
_obj = dict(name='王记炒面', code=9527)
class Merchant:
def __init__(self, _obj):
self.name = _obj['name']
self.code = _obj['code']
def __setattr__(self, key, value):
print ("__setattr__ %s" % key)
def set_obj(self, name):
self.name = name
def test(self):
pass
if __name__ == '__main__':
p = Merchant(_obj)
p.set_obj('张记炒面')
p.set_obj = ''
print dir(p)
"""运行结果:
__setattr__ name //__init__ 初始化阶段
__setattr__ code //__init__ 初始化阶段
__setattr__ name //p.set_obj('张记炒面')
__setattr__ set_obj //p.set_obj = ''
['__doc__', '__init__', '__module__', '__setattr__', 'set_obj', 'test']
"""
跳过_ setattr _的骚操作,但如果如要对属性进行访问或者设置做一些控制,重载getattr和setattr还是必要的,例如对code需要仅为10000以下,此时在大于10000的属性输入校验时raise 一个异常
_obj = dict(name='王记炒面', code=9527)
class Merchant:
def __init__(self, _obj):
self.__dict__.update(_obj)
def __setattr__(self, key, value):
print ("__setattr__ %s" % key)
def set_obj(self, name):
self.name = name
def test(self):
pass
if __name__ == '__main__':
p = Merchant(_obj)
p.set_obj('张记炒面')
p.set_obj = ''
print dir(p)
"""运行结果:
__setattr__ name
__setattr__ set_obj
['__doc__', '__init__', '__module__', '__setattr__', 'set_obj', 'test']
"""