1
votes

Ne pas obtenir le résultat attendu en utilisant le descripteur en Python

Je suis nouveau dans Python ... J'essayais du code avec Descriptor et j'exécutais le code ci-dessous pour changer Fahrenheit en Celsius. Mais je n'obtiens pas le résultat exact. Quelqu'un peut-il vous aider, comment ça marche?

J'ai essayé le code ci-dessous

import sys
import os

class Celsius:
    def __get__(self, obj, owner):
        return self.celsius

    def __set__(self, obj, value):
        self.celsius = (value-32)*5/9

class Temperature:
    celsius = Celsius()

    def __init__(self, f):
        self.fahrenheit = f

t1 = Temperature(32)
t1.celsius = 0

if __name__ == "__main__":
        t1 = Temperature(int(input()))
        print(t1.fahrenheit, t1.celsius)

Résultat attendu: (212, 100,0) (Selon la formule) résultat réel: (212, -17.77777777777778) Comment calcule-t-il -17?


1 commentaires

Comment? De là: t1.celsius = 0 ; -32 * 5/9


3 Réponses :


0
votes
t1.celsius = 0
This is your mistake. You're creating Celsius class with zero value, so the setter sets (0 - 32)*5/9 that is - 17.777777777778

2 commentaires

Transmettez également la valeur à la classe Celsius lorsque vous la prenez en entrée


Veuillez ajouter à votre réponse.



0
votes

Vous ne devez pas initialiser t1.celsius avec 0, mais plutôt utiliser le setter de celsius dans Temperature .__ init__ :

class Temperature:
    celsius = Celsius()

    def __init__(self, f):
        self.fahrenheit = self.celsius = f

Démo: https://repl.it/repls/UsableSunnyConfig


2 commentaires

Merci pour une réponse rapide ... cela fonctionne maintenant ... mais pourquoi attribuons-nous Fahrenheit à Celsius ..... cela devrait passer par Celsius Object / Class?


Heureux d'avoir pu aider. C'est parce que vous avez créé le setter de la classe de descripteur Celsius pour convertir Fahrenheit en Celsius. Nous assignons Fahrenheit à Celsius pour utiliser réellement ce setter.



0
votes

Voici un simple gestionnaire de température qui gère les conversations de: Kelvin, Fahrenheit, Celsius

class Temperature:
    def __init__(self, value, unit='C'):
        self.value = value
        if unit.upper() in ['C', 'F', 'K']:
            self.unit = unit.upper()
        else:
            raise ValueError('Unit must be C|F|K')

    @property
    def kelvin(self):
        if self.unit == 'K':
            return self.value
        elif self.unit == 'C':
            return self.value - 273.15
        else:
            return (self.value - 273.15) * 9 / 5 + 32

    @property
    def celsius(self):
        if self.unit == 'C':
            return self.value
        elif self.unit == 'K':
            return self.value + 273.15
        else:
            return (self.value * 9 / 5) + 32

    @property
    def fahrenheit(self):
        if self.unit == 'F':
            return self.value
        elif self.unit == 'C':
            return (self.value - 32) * 5 / 9
        else:
            return (self.value - 32) * 5 / 9 + 273.15


t = Temperature(7,'k')
print(t.fahrenheit)


0 commentaires