Sida 1 av 1

OOPython > kmom01 > lab1 > Exercise 2.2

InläggPostat: 06 jan 2018, 12:29
av brian-welch
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

Re: OOPython > kmom01 > lab1 > Exercise 2.2

InläggPostat: 08 jan 2018, 09:06
av Zeldah
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.

Re: OOPython > kmom01 > lab1 > Exercise 2.2

InläggPostat: 09 jan 2018, 06:31
av brian-welch
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....

Re: OOPython > kmom01 > lab1 > Exercise 2.2

InläggPostat: 09 jan 2018, 08:38
av Zeldah
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.

Re: OOPython > kmom01 > lab1 > Exercise 2.2

InläggPostat: 09 jan 2018, 09:02
av brian-welch
<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