These are chat archives for BernieenJos/weetikveel

7th
Jul 2015
JosvanderSpek
@JosvanderSpek
Jul 07 2015 01:39
Ooooh ja ga ik proberen
Nou ja ik wil gewoon dat op het moment dat de WOP (World's Oldest Person) iemand passeert, dat ze dan in de lijst oldest_people = [Jeanne, Sarah, ..., Jeralean, WOP] met die persoon van plek wisselt
Zodat de lijst daarna oldest_people = [Jeanne, Sarah, ..., WOP, Jeralean] is
JosvanderSpek
@JosvanderSpek
Jul 07 2015 16:55
Het werkt iig!
JosvanderSpek
@JosvanderSpek
Jul 07 2015 17:09
Dit snap ik dan weer niet
class Person:
    def __init__(self, name, number, days_until, age):
        self.name = name
        self.number = number
        self.days_until = days_until
        self.age = age

class W_O_P:
    name = WOP
    number = oldest_people.index(name) + 1
    def __init__(self, Birthday):
        age = years
        def days_until(self, Birthday):
            daysTillBirthday = m.ceil((time.mktime(time.strptime("%i 07 06"%(nextBirthday + Birthday - (age + 1)),"%Y %m %d")) - now)/86400.0)
            return daysTillBirthday
        self.days_until = days_until(self, Birthday)
        self.age = Birthday

class Bets:
    def __init__(self, which_bet, days_until, zinnetje):
        self.which_bet = which_bet
        self.days_until = days_until
        self.zinnetje = zinnetje


Jeanne         = Person(oldest_people[0], oldest_people.index(oldest_people[0]) + 1, daysTillJC, 122)
Sarah        = Person(oldest_people[1], oldest_people.index(oldest_people[1]) + 1, daysTillSK, 119)
Lucy            = Person(oldest_people[2], oldest_people.index(oldest_people[2]) + 1, daysTillLH, 117)
Marie_Louise= Person(oldest_people[3], oldest_people.index(oldest_people[3]) + 1, daysTillMLM, 117)
Misao       = Person(oldest_people[4], oldest_people.index(oldest_people[4]) + 1, daysTillMO, 117)
Maria       = Person(oldest_people[5], oldest_people.index(oldest_people[5]) + 1, daysTillMC, 116)
Gertrude    = Person(oldest_people[6], oldest_people.index(oldest_people[6]) + 1, daysTillGW, 116)
Tane        = Person(oldest_people[7], oldest_people.index(oldest_people[7]) + 1, daysTillTI, 116)
Elizabeth   = Person(oldest_people[8], oldest_people.index(oldest_people[8]) + 1, daysTillEB, 116)
Besse       = Person(oldest_people[9], oldest_people.index(oldest_people[9]) + 1, daysTillBC, 116)
Jiroemon    = Person(oldest_people[10], oldest_people.index(oldest_people[10]) + 1, daysTillJK, 116)
Jeralean    = Person(oldest_people[11], oldest_people.index(oldest_people[11]) + 1, daysTillJT, 116)
Bet_1       = Bets("Jos", daysVicNow, "days left in which I can win the bet!")
Bet_2       = Bets("Robert", daysVicNowRobert, "days left until Robert wins the bet!")
Death       = Bets("Death", daysTillDeathNow, "days left until she will reach the expected age of death.")

Oldest_People = [Jeanne, Sarah, Lucy, Marie_Louise, Misao, Maria, Gertrude, Tane, Elizabeth, Besse, Jiroemon, Jeralean, W_O_P(years)]
a = oldest_people.index(WOP)
A = Oldest_People.index(W_O_P(years))


Traceback (most recent call last):
  File "Oldest People 4.4.3.py", line 137, in <module>
    A = Oldest_People.index(W_O_P(years))
ValueError: <__main__.W_O_P object at 0x101de60f0> is not in list
Hoezo is W_O_P(years) not in list? Het is wel degelijk in list :p
Overigens is W_O_P(years) nu gelijk aan W_O_P(116)
Of moet ik echt een object instantiëren ofzo? Dat ik iets zeg als:
W_O_P_now = W_O_P_(years)
iambernie
@iambernie
Jul 07 2015 18:59
Wanneer je voor de tweede keer een W_O_P object instantieert (in A = ...) dan is dit een ander object dan degene in Oldest_People. Python zal gelukkig niet voor jou veronderstellen dat deze twee objecten dezelfde zijn. Er zijn namelijk ook genoeg gevallen te bedenken waarin je wilt dat deze objecten anders zijn. In het stukje code hieronder zie je bijvoorbeeld dat de ene Foo(16) niet de ander is. Dat is te zien aan het geheugenadres (0x7f.....):
>>> class Foo:
...     def __init__(self, age):
...         self.age = age
... 
>>> oldest = [Foo(16)]
>>> oldest[0]
<__main__.Foo object at 0x7f0920389ba8>
>>> Foo(16)
<__main__.Foo object at 0x7f09202e6c50>
>>> x = Foo(16)
>>> x
<__main__.Foo object at 0x7f09202e6828>
>>> oldest[0] == x
False
>>>
iambernie
@iambernie
Jul 07 2015 19:16

Het is zelfs zo dat:

>>> Foo(16) == Foo(16)
False

Echter, dat het geheugenadres anders is, wil niet zeggen dat je er niet voor kunt zorgen dat iets alsFoo(16) == Foo(16) als nog als True wordt geevalueerd. Je zult dan moeten definieren wanneer twee objecten aan elkaar gelijk zijn. Dat doe je door __eq__ te definieren. Hieronder een voorbeeld:

>>> class Bar:
...     def __init__(self, age):
...         self.age = age
...     def __eq__(self, othr):
...         return self.age == othr.age
...
>>> x = Bar(16)
>>> y = Bar(16)
>>> x
<__main__.Bar object at 0x7f09202e6c88>
>>> y
<__main__.Bar object at 0x7f09202e6c50>
>>> x==y
True

>>> [Bar(10), x, Bar(12)].index(y)
1