Python TypeError: объект 'int' не вызывается в ООП - PullRequest
0 голосов
/ 25 октября 2019

У меня проблема. Я учусь использовать setters в Python. У меня есть некоторый код здесь, и я пытаюсь использовать метод measure_set, который не работает, потому что у меня есть TypeError: 'int' object is not callable. Может кто-нибудь объяснить мне, почему это происходит? Я пытался найти решение, но я не нашел подобной проблемы в ООП с использованием сеттеров. Спасибо, и хорошего дня.

class Sensor:
    def __init__(self, location, _measurement = 0, _precision = float('inf'), _unit = 'N/A'):
        self._measurement = _measurement
        self._precision = _precision
        self._unit = _unit
        self.location = location
        self.log = []

    @property
    def log_average(self):
        return sum(self.log)/len(self.log)

    @property
    def measurement(self):
        return self._measurement

    @measurement.setter
    def measure_set(self, measure):
        self._measurement = measure
        self.log.append(self._measurement)

    @property
    def description(self):
        return f'{self._measurement} +/- {self._unit}'

if __name__ == '__main__':
    s = Sensor('Ostatni Grosz')
    print(s.description)
    s.measure_set(10)
    s.measure_set(20)
    print(s.log)
    print(s.log_average)

1 Ответ

1 голос
/ 25 октября 2019

Имя установщика должно совпадать с именем свойства.

@measurement.setter
def measurement(self, measure):
    self._measurement = measure
    self.log.append(self._measurement)

, поскольку экземпляру property, возвращаемому measurement.setter, присвоено имя measurement. С вашим кодом у вас теперь есть два отдельных свойства: одно (только для чтения) свойство с именем measurement и одно с именем measurement_set.

Сеттер не предназначен для непосредственного вызова (и не можетпотому что имя больше не относится к вызываемому объекту, но к свойству). Когда вы пишете self.measurement_set(10), атрибут доступа self.measurement_set возвращает (через геттер) текущее int значение self._measurement, а затем пытается вызвать его с аргументом 10.

Вместо этого выпросто присваивайте свойству напрямую, что вызывает вызов метода установки.

s.measurement = 10
s.measurement = 20 
...