Реализация методов по умолчанию в python (__str __, __eq __, __ repr __, ect.) - PullRequest
5 голосов
/ 29 октября 2011

Есть ли способы добавить простые реализации для __str__, __eq__, __repr__ в класс?

По сути, я хочу, чтобы __eq__ был просто тем, является ли все экземпляр без префиксапеременные равны.
И __str__ / __repr__, который просто называет каждую переменную и вызывает str / repr для каждой переменной.
Существует ли механизм для этого в стандартной библиотеке?

1 Ответ

11 голосов
/ 29 октября 2011

Вы можете определить Default mixin:

class Default(object):
    def __repr__(self):
        return '-'.join(
            str(getattr(self,key)) for key in self.__dict__ if not key.startswith('_'))
    def __eq__(self,other):
        try:
            return all(getattr(self,key)==getattr(other,key)
                       for key in self.__dict__ if not key.startswith('_'))
        except AttributeError:
            return False


class Foo(Default):
    def __init__(self):
        self.bar=1
        self.baz='hi'

foo=Foo()
print(foo)
# hi-1

foo2=Foo()
print(foo==foo2)
# True

foo2.bar=100
print(foo==foo2)
# False
...