@staticmethod
と@classmethod
の違いを把握しようとしています。後者にはcls
インスタンスが渡されます。@classmethodデコレートされたメソッドを呼び出すと、TypeErrorがスローされます
@classmethod
に電話をかけようとしたときにエラーが発生しています。
REPLの@classmethod
(to_c()
とto_f()
)の装飾方法はどうすればいいですか?ここで
>>> from temperature_converter import *
>>> c = TemperatureConverter(41)
>>> TemperatureConverter.to_f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Repos\Python\module-3\temperature_converter.py", line 21, in to_f
return cls.c_to_f(cls.temperature)
File "C:\Repos\Python\module-3\temperature_converter.py", line 25, in c_to_f
return celsius * 9/5 + 32
TypeError: unsupported operand type(s) for *: 'property' and 'int'
はクラスで呼び出す
TemperatureConverter
class TemperatureConverter:
_temperature = 0
@property
def temperature(self):
return self._temperature
@temperature.setter
def temperature(self, value):
self._temperature = value
def __init__(self, temperature):
self.temperature = temperature
@classmethod
def to_c(cls):
return cls.f_to_c(cls.temperature)
@classmethod
def to_f(cls):
return cls.c_to_f(cls.temperature)
@staticmethod
def c_to_f(celsius):
return celsius * 9/5 + 32
@staticmethod
def f_to_c(fahrenheit):
return (fahrenheit - 32) * 5/9
あなたがしようとしていることは意味をなさない。 'cls.temperature'は、値を持つインスタンスではなく、記述子オブジェクト自体を参照します。クラスメソッドも静的メソッドも、すべてのインスタンス値にアクセスすることはできません。 –
'to_c'と' to_f'をclassmethodsにしたいのはなぜですか?彼らが変換しようとしている可能性が高い温度は、その名前のclass属性が常に '0'であるため、' _temperature'インスタンス属性です(引数を与えるために定義を変更しない場合)。非常にインスタンスが(プロパティを介して)コンストラクタによって割り当てられた値を取得するので、class属性はデフォルト値としても必要ありません。 – Blckknght