NameError: naam ‘zelf’ is niet gedefinieerd

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 selfis 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 Nonete 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)

Other episodes