Waarom zo’n structuur
class A:
def __init__(self, a):
self.a = a
def p(self, b=self.a):
print b
geeft een fout NameError: name 'self' is not defined
?
Antwoord 1, autoriteit 100%
Standaardargumentwaarden worden geëvalueerd tijdens functiedefinitietijd, maar self
is een argument dat alleen beschikbaar is tijdens functieaanroep. Argumenten in de argumentenlijst kunnen dus niet naar elkaar verwijzen.
Het is een gebruikelijk patroon om een argument standaard op None
te zetten en daarvoor een test in code toe te voegen:
def p(self, b=None):
if b is None:
b = self.a
print b
Antwoord 2, autoriteit 11%
Voor gevallen waarin u ook de optie wilt hebben om ‘b’ in te stellen op Geen:
def p(self, **kwargs):
b = kwargs.get('b', self.a)
print b
Antwoord 3, autoriteit 6%
Als je hier via google bent beland, controleer dan of je jezelf als eerste parameter aan een class-functie hebt gegeven. Vooral als u probeert te verwijzen naar waarden voor die objectinstantie binnen de klassefunctie.
def foo():
print(self.bar)
>NameError: naam ‘zelf’ is niet gedefinieerd
def foo(self):
print(self.bar)