NameError: 'self' adı tanımlanmadı


145

Neden böyle bir yapı

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

hata veriyor NameError: name 'self' is not definedmu?

Yanıtlar:


159

Varsayılan bağımsız değişken değerleri işlev tanımlaması zamanında değerlendirilir, ancak selfyalnızca işlev çağrısı zamanında kullanılabilen bir bağımsız değişkendir. Dolayısıyla, argüman listesindeki argümanlar birbirlerine atıfta bulunamaz.

Bir argümanı varsayılan olarak belirlemek Noneve kodda bunun için bir test eklemek yaygın bir kalıptır :

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
Yukarıdakilerin çok güzel olmadığını düşünmeme rağmen (işlerin iyi çalıştığı yakuttan geliyorum), yukarıdaki aslında bir geçici çözüm olarak çalışıyor. Python'un bir parametre listesinde kendini kullanılamaz hale getirmeyi seçmesi hala garip.
18:18 shevy

2
@shevy: "benlik" in python'da özel bir anlamı yok, sadece ilk argüman için geleneksel olarak seçilen isim . "Ben" i "ben" veya "x" ile de değiştirebilirsiniz.
Maksimum

Bunu yapmanın daha iyi bir yolu yok mu? Kendine başvurması gereken bir düzine varsayılan argüman alan bir fonksiyonumuz varsa, gerçekten bir düzine if ifadesine ihtiyacımız var mı? Bu çok garip.
Richard J. Barbalace

16

'B' ayarını Yok olarak ayarlamak istediğiniz durumlarda:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

Buraya google üzerinden geldiyseniz, lütfen bir sınıf işlevinin ilk parametresi olarak kendini verdiğinizden emin olun. Özellikle işlevin içindeki nesne için değerlere başvurmaya çalışırsanız.

def foo():
    print(self.bar)

> NameError: 'self' adı tanımlanmadı

def foo(self):
    print(self.bar)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.