DCG Skrevet 5. januar 2010 Del Skrevet 5. januar 2010 (endret) class MyClass: def add(a,b): c=a+b return c x = MyClass() print(x.add(1,2)) Når jeg kjører denne får jeg følgende beskjed: "TypeError: add() takes exactly 2 positional arguments (3 given)". Mulig jeg er blind, men jeg gir kun to argumenter? Jeg har på følelsen at jeg gjør noe grunnleggende dumt, men hva da? Endret 5. januar 2010 av DCG Lenke til kommentar
steingrim Skrevet 5. januar 2010 Del Skrevet 5. januar 2010 Instansmetoder i Python tar en referanse til objektet som eksplisitt første argument i metode-definisjonen. Denne mangler du. Klassen din skal se slik ut: class MyClass: def add(self, a, b): return a + b Legg merke til "self" i metodedefinisjonen! http://docs.python.org/tutorial/classes.html Lenke til kommentar
DCG Skrevet 5. januar 2010 Forfatter Del Skrevet 5. januar 2010 Aha, da fungerte det ja Sært, har ikke sett det i noe språk før Lenke til kommentar
steingrim Skrevet 5. januar 2010 Del Skrevet 5. januar 2010 I de fleste andre språk er det vel implisitt ja, så man tenker ikke over det, men i Python er det eksplisitt og man blir fort vant til det Lenke til kommentar
zotbar1234 Skrevet 6. januar 2010 Del Skrevet 6. januar 2010 (endret) Aha, da fungerte det ja Sært, har ikke sett det i noe språk før Instanspeker er ofte implisitt, men den er alltid der. Fordelen med Python sin løsning (foruten ett nøkkelord mindre) er at en metode er ikke forskjellig fra en funksjon -- det å kalle en metode og en funksjon foregår likt: >>> def foo(): return "I am foo" ... >>> class A: ... def bar(self): return "I am bar" ... >>> x = A() >>> foo() 'I am foo' >>> A.bar(x) 'I am bar' Det finnes naturligvis syntaktisk sukker for objekter, slik at x.foo() -> x.__class__.foo(x), men kallene kan utføres helt likt mellom metoder og funksjoner. Fordelen med dette er at metoder likestilles med funksjoner, objekter hvis klasse implementerer __call__() og lambda-funksjoner hva bruken angår. Dette er spesielt nyttig når man bruker funksjoner som returnerer funksjoner, currying (i den grad det lar seg gjøre mtp hvor defekte lambdaene er i Python) og til dels "tabelldrevet"-programmering: >>> def doubler(f): ... def internal(*rest, **kw): ... return 2*f(*rest, **kw) ... return internal >>> def plus1(x): ... return x+1 >>> class Operations: ... def plus10(self, x): return x+10 ... @staticmethod ... def plus20(x): return x+20 >>> x = Operations() >>> callables = [plus1, x.plus10, Operations.plus20] >>> [func(3) for func in callables] [4, 13, 23] >>> >>> [func(3) for func in map(doubler, callables)] [8, 26, 46] Det er ingen forskjell i hvordan elementene i callables blir behandlet. edit: urk. code-taggen likte dårlig innrykk fra python toplevel. Endret 6. januar 2010 av zotbar1234 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå