В вашем __init__
вы создаете экземпляр Person
объекта, который присваивается self.person.
Затем вы переопределяете поиск атрибутов в экземпляре Manager (реализуя __getattr__
для этого класса) и перенаправляете эти атрибуты для поиска в переменной self.person (которая является объектом Person
из в данном конкретном случае).
Как упоминал Феликс Клинг в комментариях, было бы разумнее сделать Manager
наследником от Person
. В приведенном выше коде выглядит, что у менеджера есть человек, в то время как логичнее думать, что менеджер является человеком.
Вы могли бы сделать что-то вроде этого:
class Person(object):
def __init__(self, name, job=None, pay=0):
self.name = name
self.job = job
self.pay = pay
def give_raise(self, percent):
self.pay = int(self.pay *(1 + percent))
def __str__(self):
return "[Person: %s, %s]" % (self.name, self.pay)
class Manager(Person):
def __init__(self, name, pay):
super(Manager, self).__init__(name, "mgr", pay)
def give_raise(self, percent, bonus=.10):
self.pay = int(self.pay * (1 + (percent + bonus)))
# example usage
John = Person("John", "programmer", 1000)
Dave = Manager("Dave", 2000)
print John, Dave
John.give_raise(.20)
Dave.give_raise(.20)
print John, Dave