Python classes: method has same name as property
Question: I'm constructing a class Heating. Every instance of this class has the
property 'temperature'. It's mandatory that Heating also supports the method
temperature() that prints the property 'temperature' as an integer.

When I call the method temperature() I get the error 'int' object is not
callable because self.temperature is already defined as an integer.

How do I solve this?

code:

    
    
    class Heating:
        """
        >>> machine1 = Heating('radiator kitchen', temperature=20)
        >>> machine2 = Heating('radiator living', minimum=15, temperature=18)    
        >>> machine3 = Heating('radiator bathroom', temperature=22, minimum=18, maximum=28)
        >>> print(machine1)
        radiator kitchen: current temperature: 20.0; allowed min: 0.0; allowed max: 100.0
        >>> machine2
        Heating('radiator living', 18.0, 15.0, 100.0)
        >>> machine2.changeTemperature(8)
        >>> machine2.temperature()
        26.0
        >>> machine3.changeTemperature(-5)
        >>> machine3
        Heating('radiator bathroom', 18.0, 18.0, 28.0)
        """
        def __init__(self, name, temperature = 10, minimum = 0, maximum = 100):
            self.name = name
            self.temperature = temperature
            self.minimum = minimum
            self.maximum = maximum
    
        def __str__(self):
            return '{0}: current temperature: {1:.1f}; allowed min: {2:.1f}; allowed max: {3:.1f}'.format(self.name, self.temperature, self.minimum, self.maximum)
    
        def __repr__(self):
            return 'Heating(\'{0}\', {1:.1f}, {2:.1f}, {3:.1f})'.format(self.name, self.temperature, self.minimum, self.maximum)
    
        def changeTemperature(self, increment):
            self.temperature += increment
    
            if self.temperature < self.minimum:
                self.temperature = self.minimum
    
            if self.temperature > self.maximum:
                self.temperature = self.maximum
    
        def temperature(self):
            return self.temperature
    
    
    
    
    # testen van het programma 
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    


Answer: You can't have both a method and an attribute with the same name. Methods are
attributes too, albeit ones that you can call.

Just rename the attribute to something else. You could use `_temperature`:

    
    
    def __init__(self, name, temperature = 10, minimum = 0, maximum = 100):
        self.name = name
        self._temperature = temperature
        self.minimum = minimum
        self.maximum = maximum
    
    def __str__(self):
        return '{0}: current temperature: {1:.1f}; allowed min: {2:.1f}; allowed max: {3:.1f}'.format(self.name, self._temperature, self.minimum, self.maximum)
    
    def __repr__(self):
        return 'Heating(\'{0}\', {1:.1f}, {2:.1f}, {3:.1f})'.format(self.name, self._temperature, self.minimum, self.maximum)
    
    def changeTemperature(self, increment):
        self._temperature += increment
    
        if self.temperature < self.minimum:
            self._temperature = self.minimum
    
        if self.temperature > self.maximum:
            self._temperature = self.maximum
    
    def temperature(self):
        return self._temperature
    

Now your class has both `_temperature` (the integer) and `temperature()` (the
method); the latter returns the former.

