python – __getattr__的计数器部分
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – __getattr__的计数器部分,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1910字,纯文字阅读大概需要3分钟。
内容图文
![python – __getattr__的计数器部分](/upload/InfoBanner/zyjiaocheng/721/96f5d10e4be24c4abfa2fe3d0f2f9702.jpg)
我试图找到一种方法来设置封装到类中的dict值,例如使用__getattr__我可以返回内部dict值,但是即使属性存在也会调用__setattr__,这使得我的实现很难看.以下示例简化了我的实际类继承自Subject类(观察者模式的主题部分)
我想要实现这样的事情:
obj = Example()
obj.username = 'spidername' # all OK username is a key in the internal dict
# but company is not a key in the internal dict so
obj.company = 'ABC' # will raise AttributeError
我问是否有比我下面的方式更好的方式:
class Example(object):
def __init__(self, table=None):
self._fields = {}
self._table = table
def _set_fields(self):
"""
this method will be implemented by
subclasses and used to set fields names and values
i.e.
self._field['username'] = Field(default='unknown', is_primary=False)
"""
raise NotImplementedError
def __getattr__(self, name):
"""
great this method is only called when "name"
is not an attribute of this class
"""
if name in self._fields:
return self._fields[name].value
return None
def __setattr__(self, name, value):
"""
not so great, this method is called even for
attributes that exists in this class
is there a better way to do the following?
this can be in __init__, but its still ugly
"""
attribs = ['_fields', '_table']
if name in attribs:
super(Example, self).__setattr__(name, value)
else:
if name in self._fields:
self._fields[name].value = value
else:
raise AttributeError
编辑:调整了代码注释,添加了missin引号
解决方法:
问题是首次分配属性时不存在属性.在__init__中,当您第一次将字典分配给_fields时,_fields不是属性.它仅在分配后成为现有属性.如果你事先知道属性是什么,你可以使用__slots__,但我的猜测是你没有.所以我的建议是手动将这些插入到实例dict中:
class Example(object):
def __init__(self, table=None):
self.__dict__['_fields'] = {}
self.__dict__['_table'] = table
...
def __setattr__(self, name, value):
if name in self._fields:
self._fields[name].value = value
else:
raise AttributeError
但是,通过此实现,以后添加或更改实例属性的唯一方法是通过__dict__.但我认为这不太可能.
内容总结
以上是互联网集市为您收集整理的python – __getattr__的计数器部分全部内容,希望文章能够帮你解决python – __getattr__的计数器部分所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。