【发布时间】:2017-04-17 09:10:29
【问题描述】:
我正在尝试找出@staticmethod 和@classmethod 之间的区别。后者传递了一个cls 实例。
当我尝试调用@classmethod 时,它给了我一个错误。
我应该如何在 REPL 中调用 @classmethod(to_c() 和 to_f())装饰方法?
这是 REPL 调用
>>> 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成为类方法?他们可能想要转换的温度(如果您不更改他们的定义以给他们一个参数)是_temperature实例属性,因为该名称的类属性将始终为0。确实不需要 class 属性,即使作为默认值,因为每个实例都会获得构造函数(通过属性)分配的值。
标签: python static-methods read-eval-print-loop class-method