NameError: nama 'diri' tidak didefinisikan


144

Mengapa struktur seperti itu

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

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

memberi kesalahan NameError: name 'self' is not defined?

Jawaban:


159

Nilai argumen default dievaluasi pada waktu fungsi-menentukan, tetapi selfmerupakan argumen hanya tersedia pada waktu panggilan fungsi. Jadi argumen dalam daftar argumen tidak dapat saling merujuk.

Ini adalah pola umum untuk menetapkan argumen Nonedan menambahkan tes untuk itu dalam kode:

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

4
Meskipun saya pikir hal di atas tidak terlalu cantik (saya berasal dari ruby ​​di mana semuanya berfungsi dengan baik), hal di atas sebenarnya berfungsi sebagai solusi. Masih aneh bahwa python memilih untuk membuat diri tidak tersedia di daftar parameter.
Shevy

2
@shevy: "self" tidak memiliki arti khusus dalam python, hanya nama yang dipilih secara konvensional untuk argumen pertama. Anda juga dapat mengganti "diri" dengan "saya" atau "x".
Maks

Apakah tidak ada cara yang lebih baik untuk melakukan ini? Jika kita memiliki fungsi yang membutuhkan selusin argumen default yang harus merujuk diri, apakah kita benar-benar membutuhkan selusin pernyataan if? Ini sangat canggung.
Richard J. Barbalace

16

Untuk kasus di mana Anda juga ingin memiliki opsi pengaturan 'b' ke Tidak Ada:

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

6

Jika Anda telah tiba di sini melalui google, pastikan untuk memeriksa bahwa Anda telah memberikan diri sebagai parameter pertama ke fungsi kelas. Terutama jika Anda mencoba referensi nilai untuk objek di dalam fungsi.

def foo():
    print(self.bar)

> NameError: nama 'diri' tidak ditentukan

def foo(self):
    print(self.bar)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.