您可以使用如下结构获取Class的所有属性:
from itertools import chain
@classmethod
def _properties(cls):
type_dict = dict(chain.from_iterable(typ.__dict__.items() for typ in reversed(cls.mro())))
return {k for k, v in type_dict.items() if 'property' in str(v)}
__eq__会变成这样:
def __eq__(self, other):
properties = self._properties() & other._properties()
if other._properties() > properties and self._properties() > properties:
# types are not comparable
return False
try:
return all(getattr(self, prop) == getattr(other, prop) for prop in properties)
except AttributeError:
return False
使用反转(cls.mro())的原因是这样的事情也有效:
class Worker(Person):
@property
def wage(self):
return 0
p4 = Worker('Raymond', 'Salemi')
print(p4 == p3)
06003