我有以下代碼。類對象和比較特定屬性
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__
現在我想利用這個代碼,並只做__eq__
一組特定的attrs的(「鑰匙」)。所以我改成了這樣:
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 - 但我想保持並遵循標準pythonic方法。謝謝!!
更新
有人問我,爲什麼我不能在我的課修復ATTRS。這是一個很好的問題,這就是爲什麼。這樣做的目的是取得幾個不相關的員工記錄並構建完整的員工照片。例如,我從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)
感謝兩個紳士審查!
我不明白你的構造函數:你準備做一個人()並每次傳遞屬性列表?我會認爲這些屬性是人類的固定特徵。也許是它將如何被調用的一個例子? – 2009-11-10 15:43:36
偉大的問題。我從一組固定的屬性開始,但我發現代表一個人的不同方式出現了。所以我想我只是通過一個attrs列表。我會擴展爲什麼我這樣做。好老鷹的眼睛。 – rh0dium 2009-11-10 16:46:24
如我在答覆中提到的,如果'self'中有效的某些鍵從'other'中丟失,那麼您仍然會在'__eq__'中崩潰。 – 2009-11-11 00:19:19