@okalash

Каким должен быть модификатор доступа при инициализации свойства?

Доброго времени суток!
Сейчас у меня около 10 вечера и то ли у меня мозг перестал работать, то ли я что-то пропустил.

Решил я для тренировки написать класс на Python и возник диссонанс. При определении свойства, что бы сработал сеттер, модификатор доступа для него должен быть публичным, а с приватным не срабатывает.

Наткнулся на несколько статью раз (пункт аннотации свойств) и статью два (пункт свойства), где я и брал информацию.

И собственно, проблема в чем.
Код весь мой, прошу не ругать за его качество написания.
Код 1, где ложное значение проходит:
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def __str__(self):
        return f'This car is {self.make.title()} {self.model.title()} from {self.year}'

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_capacity):
        super().__init__(make, model, year)
        self.__bat_capacity = battery_capacity   #воть тут проблема в __

    @property
    def bat_capacity(self):
        return self.__bat_capacity

    @bat_capacity.setter
    def bat_capacity(self, value):
        if isinstance(value, (int,float)) and value > 10:
            self.__bat_capacity = value
        else:
            print('Not correct value')
            self.__bat_capacity = 10

    def __str__(self):
        return Car.__str__(self) + ' with battery ' + str(self.__bat_capacity)

el_car = ElectricCar('tesla', 'model 3', 2020, 4)
print(el_car)


Вывод первого кода:

This car is Tesla Model 3 from 2020 with battery 4


Код 2, который работает:
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def __str__(self):
        return f'This car is {self.make.title()} {self.model.title()} from {self.year}'

class ElectricCar(Car):
    def __init__(self, make, model, year, battery_capacity):
        super().__init__(make, model, year)
        self.bat_capacity = battery_capacity   # убрал __

    @property
    def bat_capacity(self):
        return self.__bat_capacity

    @bat_capacity.setter
    def bat_capacity(self, value):
        if isinstance(value, (int,float)) and value > 10:
            self.__bat_capacity = value
        else:
            print('Not correct value')
            self.__bat_capacity = 10

    def __str__(self):
        return Car.__str__(self) + ' with battery ' + str(self.__bat_capacity)

el_car = ElectricCar('tesla', 'model 3', 2020, 4)
print(el_car)


Вывод второго кода:

Not correct value
This car is Tesla Model 3 from 2020 with battery 10


Возможно, я что-то пропустил? Или упускаю? Прошу помочь и направить на путь истинный.
Заранее спасибо
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
Vindicar
@Vindicar
Не, ну а в чем вопрос-то.
В первом случае ты вообще обходишь сеттер свойства, присваивая значение напрямую приватному полю. Сеттер не вызывается, так как ты не обращаешься к свойству bat_capacity.
Во втором случае ты присваиваешь значение свойству, тем самым провоцируя срабатывание сеттера, который и валидирует значение.
61ee67404277a591391562.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы