2016-08-29 12 views
-2

私はクラスヒーティングを構築しています。このクラスのすべてのインスタンスはプロパティ '温度'を持ちます。ヒーティングは、プロパティ 'temperature'を整数として出力するメソッドtemperature()もサポートしていることが必須です。Pythonクラス:メソッドはプロパティと同じ名前を持っています

メソッドtemperature()を呼び出すと、self.temperatureが既に整数として定義されているため、 'int'オブジェクトが呼び出し可能でないというエラーが発生します。

どうすれば解決できますか?

コード:

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() 
+6

同じ名前のメソッドと属性の両方を持つことはできません。メソッドも属性ですが、呼び出すことはできます。 –

+0

'Heating.temperature'を返すメソッドは、' Heating.get_temperature() 'のように呼び出さなければなりません。 – Will

+1

また、ここに*プロパティ*はありません。プロパティは、(呼び出しなしで)属性として*アクセス*する特別な種類のオブジェクトですが、自動的にメソッドを呼び出します。 –

答えて

6

あなたはメソッドと同じ名前を持つ属性の両方を持つことはできません。メソッドも属性ですが、呼び出すことはできます。

属性の名前を変更してください。あなたは_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 

今、あなたのクラスは_temperature(整数)とtemperature()(メソッド)の両方を持っています。後者は前者を返します。

+0

これはトリックです!どうもありがとう! – TRogier

+0

私も同じ問題を抱え、同じコンベンションに従っていました。 しかし、私はさらに知りたいのですが、メソッドも属性ですか? –

+1

@AhmedAbdelKhalek:クラス*のメソッドの名前にアクセスすることはできません*。関数は記述子でもあり、バインディングの仕組みについては、https://docs.python.org/3/howto/descriptor.htmlを参照してください。 –

関連する問題