При использовании декораторов я устанавливаю атрибут через декоратор setter, однако он не отображается в словаре объекта. Ниже мой код
class Employee:
def __init__(self, first, last):
self.f_name = first
self.l_name = last
self.email = self.f_name + '.' + self.l_name + '@hotmail.com'
@property
def fullname(self):
return ('{} {}'.format(self.f_name,self.l_name) )
@fullname.setter
def fullname(self, name):
first, last = name.split(' ')
self.f_name = first
self.l_name = last
self.email = self.f_name + '.' + self.l_name + '@hotmail.com'
emp_1 = Employee('Sandeep', 'Behera')
print(emp_1.__dict__)
emp_1.fullname = "Alex Smith"
print(emp_1.__dict__)
emp_1.age = 20
print(emp_1.__dict__)
Запустив выше, результат:
{'f_name': 'Sandeep', 'l_name': 'Behera', 'email': '[email protected]'}
{'f_name': 'Alex', 'l_name': 'Smith', 'email': '[email protected]'}
{'f_name': 'Alex', 'l_name': 'Smith', 'email': '[email protected]', 'age': 20}
Почему «полное имя» не отображается в Dict, даже когда я назначаю
emp_1.fullname = "Alex Smith"
но он показывает атрибут «возраст». Это должно что-то делать с декораторами? Заранее спасибо.
Ваш украшенный сеттер не создает атрибут fullname
.
Добавление новой строки в ваш сеттер следующим образом даст вам атрибут full_name
:
@fullname.setter
def fullname(self, name):
first, last = name.split(' ')
self.f_name = first
self.l_name = last
self.email = self.f_name + '.' + self.l_name + '@hotmail.com'
self.full_name = name # creating an attribute full_name
Результат выглядит следующим образом:
{'f_name': 'Sandeep', 'l_name': 'Behera', 'email': '[email protected]'}
{'f_name': 'Alex', 'l_name': 'Smith', 'email': '[email protected]', 'full_name': 'Alex Smith'}
{'f_name': 'Alex', 'l_name': 'Smith', 'email': '[email protected]', 'full_name': 'Alex Smith', 'age': 20}
Почему «полное имя» не отображается в Dict, даже когда я назначаю? По той же причине, по которой
__init__
не отображается в__dict__
. Это метод вашего класса. Он просто украшен@property
, что делает его похожим на атрибут, но это не атрибут.