-2

我正在学习python中的描述符。我正在尝试代码,但得到下面提到的属性错误。

AttributeError:“celciusDescriptor”对象没有属性“_celciusDescriptor__fahrenheit”

我试图通过获取华氏温度来获得输出为(32,0),即(华氏,摄氏度)。

'''

  class celciusDescriptor:
        def __get__(self, obj, owner):
            tempc = self.__fahrenheit
            celcius = (tempc - 32)*(5/9)
            return self.celcius
        def __set__(self, obj, value):
            tempcelc = (value - 32)*(5/9)
            return tempcelc
    
           
    class Temperature:
        celcius = celciusDescriptor()
        def __init__(self, fahrenheit):
            self.fahrenheit = fahrenheit
            
    
    t1 = Temperature(32)
    t1.fahrenheit
    t1.celcius

'''

4

1 回答 1

0

这是执行此操作的一种模式(顺便说一下,类名通常以大写开头)。只需要保持摄氏或华氏值,因为可以从另一个计算。在这种情况下,我使用一个类CelsiusDescriptor来保持摄氏度值(即使您构造了一个Temperature具有华氏度值的实例),因为这就是您拥有它的方式。然后我使用普通属性来获取和设置华氏值。实际的摄氏温度值存储在Temperature对象的内部__dict__属性中,其他属性通常存储在该属性中。此描述符还执行类型强制。

class CelsiusDescriptor:
    def __init__(self, name):
        self.name = name

    def __get__(self, instance, cls):
        if instance is None:
            return self
        else:
            return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, (int, float)):
            raise TypeError('Expected an int or a float')
        instance.__dict__[self.name] = value

    def __delete__(self, instance):
        del instance.__dict__[self.name]


class Temperature:
    celsius = CelsiusDescriptor('celsius') # a class attribute

    def __init__(self, fahrenheit):
        self.celsius = (fahrenheit-32) * 5/9;

    @property
    def fahrenheit(self):
        return self.celsius*9/5 + 32

    @fahrenheit.setter
    def fahrenheit(self, fahrenheit):
        self.celsius = (fahrenheit-32) * 5/9;

t = Temperature(32)
print(t.fahrenheit, t.celsius)
t.celsius = 100
print(t.fahrenheit, t.celsius)
t.fahrenheit = -40
print(t.fahrenheit, t.celsius)

印刷:

32.0 0.0
212.0 100
-40.0 -40.0
于 2020-07-17T19:45:09.780 回答