OOPython > kmom01 > lab1 > Exercise 2.2

  • Författare
  • Meddelande
Användarvisningsbild

brian-welch

php-programmerare

  • Inlägg: 43
  • Blev medlem: 21 aug 2017, 10:56
  • Ort: Malmö

OOPython > kmom01 > lab1 > Exercise 2.2

Inlägg06 jan 2018, 12:29

Jag är fast på Exercise 2.2
Kod: Markera allt
# """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
# Exercise 2.2 (1 points)
#
# Overload the `iadd operator(+=)` in the Time class to update the own object
# with the sum of each unit,  hours+hours, minutes+minutes and
# seconds+seconds.
#
# Initialize a new Time object to a variable called `time3` , give it hours
# `11`, minutes `9` and seconds `45`.
# In the code use "+=" to update `time2` with `time3`.
#
# Answer with `time2`s info method.



I min answer.py fil, har jag:
Kod: Markera allt
time3 = Time(11, 9, 45)
time2 += time3

ANSWER = time2.info()



I min Time() class har jag:
Kod: Markera allt
# ...
    def __add__(self, other):
        return (self.calculate_seconds(self.info()) +
               other.calculate_seconds(other.info()))

    def __iadd__(self, other):
        new_seconds = (self.calculate_seconds(self.info()) +=
                      other.calculate_seconds(other.info()))

        self.hours = (int(new_seconds / 3600))
        self.minutes =(int((new_seconds % 3600) / 60))
        self.seconds =(int((new_seconds % 3600) % 60))

        return self



När jag kör min answer.py fil, får jag felmeddelandet:
Kod: Markera allt
File "/Users/Brian_Welch/dbwebb-kurser/oopython/me/kmom01/lab1/classfile.py", line 120
    new_seconds = (self.calculate_seconds(self.info()) +=
                                                        ^
SyntaxError: invalid syntax



Men, det ser lika ut some i kursmaterial (tror jag iaf...):
Kod: Markera allt
def __add__(self, other):
        return self.price + other.get_price()

    def __iadd__(self, other):
        self.price += other.get_price()
        return self

https://dbwebb.se/kunskap/kom-igang-med-objekt#operatoroverlagring
- Brian Welch
Bild
"It is impossible to work in information technology without also engaging in social engineering."
- Jaron Zepel Lanier
Användarvisningsbild

Zeldah

dbwebb

  • Inlägg: 505
  • Blev medlem: 02 mar 2016, 10:17

Re: OOPython > kmom01 > lab1 > Exercise 2.2

Inlägg08 jan 2018, 09:06

Jag tror felet ligger i hur du använder +=.
Du använder det i en uträkning,
Kod: Markera allt
new_seconds = (self.calculate_seconds(self.info()) += other.calculate_seconds(other.info()))

Om vi ersätter det med lite siffror istället,
Kod: Markera allt
new_seconds = 2+= 3

Om vi testar att bara skriva 2+=3 får vi ett annat fellmeddelande:
Kod: Markera allt
2+=3
SyntaxError: can't assign to literal

Vi kan inte tildela till en literal, det behöver vara en variabel.
Så vi kan skriva
Kod: Markera allt
test = 2
test += 3


"+=" kräver en variable till vänster. Du hämtar objektet från variabeln, adderar ett värde från objektet med det som står till höger och returnerar det uppdaterade objektet till samma variabel.
Användarvisningsbild

brian-welch

php-programmerare

  • Inlägg: 43
  • Blev medlem: 21 aug 2017, 10:56
  • Ort: Malmö

Re: OOPython > kmom01 > lab1 > Exercise 2.2

Inlägg09 jan 2018, 06:31

Tack!

Jag har annorlunda problem nu. Jag förstår mitt fel där, så ändrade min kod till:

Kod: Markera allt
def __iadd__(self, other):
        new_hours = (int(other.calculate_seconds(other.info()) /
                    3600))
        new_minutes = (int((other.calculate_seconds(other.info()) %
                        3600) / 60))
        new_seconds = ((other.calculate_seconds(other.info()) % 3600) % 60)

        self.hours += new_hours
        self.minutes += new_minutes
        self.seconds += new_seconds

        return self


Då fick jag felmeddelande:

Kod: Markera allt
self.seconds += new_seconds
TypeError: must be str, not int


Det är märklig för att det är bara seconds som får det - inte hours eller minutes. Om jag ändra ordning till:

Kod: Markera allt
        self.hours += new_hours
        self.seconds += new_seconds
        self.minutes += new_minutes


Jag får fortfarande samma fel meddelandet... seconds must be string.

Om jag följer fel meddelandet, och andra koden till dess:

Kod: Markera allt
def __iadd__(self, other):
        new_hours = (int(other.calculate_seconds(other.info()) /
                    3600))
        new_minutes = (int((other.calculate_seconds(other.info()) %
                        3600) / 60))
        new_seconds = ((other.calculate_seconds(other.info()) % 3600) % 60)

        self.hours += new_hours
        self.minutes += new_minutes
        self.seconds += str(new_seconds)

        return self


Får jag ett resultat:
Kod: Markera allt
>>>  2.2 FAIL.
>>>  You said:
47-33-0645 <class 'str'>


Och det klart fel....
- Brian Welch
Bild
"It is impossible to work in information technology without also engaging in social engineering."
- Jaron Zepel Lanier
Användarvisningsbild

Zeldah

dbwebb

  • Inlägg: 505
  • Blev medlem: 02 mar 2016, 10:17

Re: OOPython > kmom01 > lab1 > Exercise 2.2

Inlägg09 jan 2018, 08:38

Angående första felet, skulle gissa på att av någon anledning är self.seconds en sträng och du försöker du plussa den med en integer. Försök kolla i din kod där du använder self.seconds om den tilldelas en sträng på något ställe.

Jag har skrivit om koden lite för att göra den tydligare, det är onödigt att räkna ut antalet sekunder hela tiden. Värdet kommer inte ändras mellan de olika uträkningarna så då räcker det med att räkna ut det en gång.
Kod: Markera allt
tot_seconds = int(other.calculate_seconds(other.info()))
new_hours = tot_seconds / 3600
...


Svaret stämmer för timmar och minuter, men för sekunder blir det konstigt i och med att den tror att något är en sträng och konkatenerar istället för att addera. Skulle gissa på att du får rätt svar om du löser sträng saken med sekunder.
Användarvisningsbild

brian-welch

php-programmerare

  • Inlägg: 43
  • Blev medlem: 21 aug 2017, 10:56
  • Ort: Malmö

Re: OOPython > kmom01 > lab1 > Exercise 2.2

Inlägg09 jan 2018, 09:02

<forehead slap>
Doh! Klart - för att lägga en "0" fram för single siffra sekunder var jag tvungen att ändra seconds till en sträng
</forehead slap>

Det här fungerar och tack för tipsen om tot_seconds variabel

Kod: Markera allt
    def __iadd__(self, other):
        tot_seconds = int(other.calculate_seconds(other.info()))
        new_hours = (int(tot_seconds / 3600))
        new_minutes = (int((tot_seconds % 3600) / 60))
        new_seconds = ((tot_seconds % 3600) % 60)

        self.seconds = int(self.seconds)

        self.hours += new_hours
        self.seconds += new_seconds
        self.minutes += new_minutes

        return self
- Brian Welch
Bild
"It is impossible to work in information technology without also engaging in social engineering."
- Jaron Zepel Lanier

Vilka är online

Användare som besöker denna kategori: Google [Bot], Majestic-12 [Bot] och 22 gäster