Gå til innhold

[Løst][Python] Problem med funksjon/klasse


Anbefalte innlegg

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 av DCG
Lenke til kommentar
Videoannonse
Annonse
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 av zotbar1234
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...