【发布时间】:2010-12-15 02:21:26
【问题描述】:
我有以下代码。
class person(object):
def __init__(self, keys):
for item in keys:
setattr(self, item, None)
def __str__(self):
return str(self.__dict__)
def __eq__(self, other) :
return self.__dict__ == other.__dict__
现在我想使用此代码,并且只对一组特定的 attrs(“键”)执行 __eq__。所以我把它改成这样:
class person(object):
def __init__(self, keys):
self.valid_keys = keys
for item in keys:
setattr(self, item, None)
def __str__(self):
return dict([(i, getattr(self, i)) for i in self.valid_keys ])
def __eq__(self, other) :
assert isinstance(other, person)
self_vals = [ getattr(self, i) for i in self.valid_keys ]
other_vals = [ getattr(other, i) for i in self.valid_keys ]
return self_vals == other_vals
我已经阅读了以下两篇很棒的帖子(here 和 here),我的基本问题是:
这是正确的方法还是在 python 中有更好的方法?
显然是 TMTOWTDI - 但我想保留并遵循标准的 Python 方法。谢谢!!
更新
有人问我为什么不修复课堂上的属性。这是一个很好的问题,这就是为什么。这样做的目的是获取多个不连贯的员工记录并构建员工的完整图片。例如,我从 ldap、lotus notes、unix passwd 文件、bugzilla 数据等中获取数据。每个都有 uniq attrs,所以我将它们概括为一个人。这为我提供了一种快速一致的方式来比较旧记录和新记录。 HTH。谢谢
** 更新 Pt.2 **
这是我最终得到的结果:
class personObj(object):
def __init__(self, keys):
self.__dict__ = dict.fromkeys(keys)
self.valid_keys = keys
def __str__(self):
return str([(i, getattr(self, i)) for i in self.valid_keys ])
def __eq__(self, other):
return isinstance(other, personObj) and all(getattr(self, i) == getattr(other, i) for i in self.valid_keys)
感谢两位先生的审阅!
【问题讨论】:
-
我不明白你的构造函数:你要创建一个 person() 并每次都传入属性列表?我原以为属性将是人员类的固定特征。也许是一个如何调用它的例子?
-
好问题。我从一组固定的属性开始,但我发现代表一个人的不同方式出现了。所以我想我只是传递一个attrs列表。我将扩展我这样做的原因。好鹰眼。
-
如果
other中缺少某些在self中有效的键,您仍然会在__eq__中崩溃,正如我在回答中提到的那样。
标签: coding-style python