# Файл classtools.py (новый) class AttrDisplay: """ Реализует наследуемый метод перегрузки операции вывода, отображающий имена классов экземпляров и все атрибуты в виде пар имя=значение, имеющиеся в экземплярах (исключая атрибуты, унаследованные от классов). Может добавляться в любые классы и способен работать с любыми экземплярами. """ def gatherAttrs(self): attrs = [] for key in sorted(self.__dict__): attrs.append('%s=%s' % (key, getattr(self, key))) return ', '.join(attrs) def __str__(self): return '[%s: %s]' % (self.__class__.__name__, self.gatherAttrs()) if __name__ == '__main__': class TopTest(AttrDisplay): count = 0 def __init__(self): self.attr1 = TopTest.count self.attr2 = TopTest.count+1 TopTest.count += 2 class SubTest(TopTest): pass X, Y = TopTest(), SubTest() print(X) # Выведет все атрибуты экземпляра print(Y) # Выведет имя класса, # самого близкого в дереве наследования
# Файл person.py (окончательная версия) from classtools import AttrDisplay # Импортирует обобщенный инструмент class Person(AttrDisplay): """ Создает и обрабатывает записи с информацией о людях """ def __init__(self, name, job=None, pay=0): self.name = name self.job = job self.pay = pay def lastName(self): # Предполагается, что фамилия return self.name.split()[-1] # указана последней def giveRaise(self, percent): # Процент – величина в диапазоне 0..1 self.pay = int(self.pay * (1 + percent)) class Manager(Person): """ Версия класса Person, адаптированная в соответствии со специальными требованиями """ def __init__(self, name, pay): Person.__init__(self, name, 'mgr', pay) def giveRaise(self, percent, bonus=.10): Person.giveRaise(self, percent + bonus) if __name__ == '__main__': bob = Person('Bob Smith') sue = Person('Sue Jones', job='dev', pay=100000) print(bob) print(sue) print(bob.lastName(), sue.lastName()) sue.giveRaise(.10) print(sue) tom = Manager('Tom Jones', 50000) tom.giveRaise(.10) print(tom.lastName()) print(tom)