Пример работы с классами в Python

# Файл 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)