Нужна помощь по функциональности Python Descriptor - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь решить проблему, используя Python Descriptors .. Код такой, как показано ниже

class Celsius( object ):
    def __init__( self, value=0.0 ):
        self.value= float(value)
    def __get__( self, instance, owner ):
        return float(self.value)
    def __set__( self, instance, value ):
        self.value= float(value)

class Fahrenheit( object ):
    def __get__( self, instance, owner ):
        return (instance.celsius * 9 / 5 + 32.0)
    def __set__( self, instance, value ):
        instance.celsius= (float(value)-32.0) * 5 / 9

class Temperature( object ):
    def __init__(self, fahrenheit):
        self.fahrenheit = fahrenheit

    fahrenheit = Fahrenheit()
    celsius = Celsius()

t1 = Temperature(32)
print(t1.fahrenheit, t1.celsius)
t1.celsius = 0
print(t1.fahrenheit, t1.celsius)

Ожидаемое значение O / P равно

32 0.0
32.0 0.0

Но я получаю

32.0 0.0
32.0 0.0

Пожалуйста, помогите, где я должен измениться или есть какой-нибудь другой лучший способ.

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

класс Цельсия: def get (self, instance, owner): return 5 * (instance.fahrenheit - 32) / 9

def __set__(self, instance, value):
    instance.fahrenheit = 32 + 9 * value/5

Класс температура: celsius = Celsius ()

def __init__(self, initial_f):
    self.fahrenheit = initial_f
0 голосов
/ 25 февраля 2019

Проблема в том, что когда вы назначаете что-то для fahrenheit, метод __set__() для Fahrenheit делегирует instance.celsius.Все методы Celsius конвертируются в float.Если вы хотите, чтобы ваши примеры работали так, как вы ожидаете, вам потребуется Celsius для делегирования instance.fahrenheit вместо этого, при этом все еще выполняются преобразования float, возможно, только в __get__(), если вы этого хотите.

Итак, чтобы подвести итог, сохраните в типе Fahrenheit без преобразования типов и делегируйте Fahrenheit из Celsius.

Как отметили некоторые другие, ваш дескриптор делает это так, чтобы всеэкземпляры Temperature будут хранить то же значение.Если вы хотите, чтобы разные экземпляры содержали разные значения, вам нужно сохранить значение либо непосредственно в экземпляре под другим именем (обычно это будет _fahrenheit в этой ситуации), либо в виде словаря, в котором ключinstance.

Наконец, для такой ситуации, когда есть значение, разделяемое между двумя дескрипторами, и они вряд ли будут использоваться где-то еще, я бы пошел по маршруту property.

0 голосов
/ 21 февраля 2019

Без объяснения того, почему вы хотите вывод, который вы хотите ... просто если вы ХОТИТЕ этот вывод, вы можете получить его, изменив последние четыре строки своего кода на:

t1 = Temperature(32)
print(int(t1.fahrenheit), t1.celsius)
t1.celsius = 0
print(t1.fahrenheit, t1.celsius)

Вывод:

32 0.0
32.0 0.0

Полагаю, вы хотите что-то другое, но я не могу понять, чего вы хотите.Вывод, который вы получаете из своего кода, является вполне разумным.

...