Можно ли установить другие атрибуты в установщик @property в Python - PullRequest
1 голос
/ 12 мая 2019

Новичок в python, и вам интересно, можете ли вы программно установить атрибуты класса в установщике другого свойства? Например: в приведенном ниже коде я хочу установить свойство days_off на основе значения, указанного в установщике years.

class Employee:
  def __init__(self, years, days_off=20):
    print('initializing')
    self.years = years
    self.days_off = days_off

  def __str__(self):
    return f'employee with {self.years} years'

  @property
  def years(self):
    return self._years

  @years.setter
  def years(self, years):
    if  9 < years and years < 20:
      print('condition 1 hit')
      self.days_off = 25
    elif years > 20:
      print('condition 2 hit')
      self.days_off = 30
    self._years = years

test_employee = Employee(7)
other_test_employee = Employee(17)
yet_another = Employee(27)


print(test_employee.days_off) # 20
print(other_test_employee.days_off) # 20, should be 25
print(yet_another.days_off) # 20, should be 30

1 Ответ

1 голос
/ 12 мая 2019

Как отметил @Daniel Roseman в своем комментарии, сначала вы устанавливаете значение days_off, когда устанавливаете значение years, а затем заменяете его на 20, так как это следующее назначение, которое вы делаете послеself.years = years.Чтобы получить правильные результаты, вам нужно присвоить значение days_off, прежде чем присваивать значение years.Итак, ваш конструктор должен выглядеть следующим образом:

def __init__(self, years, days_off=20):
    print('initializing')
    self.days_off = days_off
    self.years = years

Повторный запуск вернет правильные результаты:

initializing
initializing
condition 1 hit
initializing
condition 2 hit
20
25
30
...