Saya seorang pemula dalam Python jadi mohon maafkan saya jika ini sepele, tetapi saya tidak dapat menemukan jawaban apa pun sejauh ini. Mengapa saya mendapatkan pesan kesalahan ini?

#define a class containing a variable and a method
#automatically generate n instances called AA,BB, CC each containing as 
#variable the letter's number (a=1, b=2 etc.)
#define a function returning "my name is BB and my var is 2"

n=5
class Letters(object):
    def __init__(self, name, var):
        self.var=var
        self.name = name
    def hello(self):
        print('my name is %s and my var is %d'%(self.name, self.var))
for x in range(0,n):
    y=chr(x+97).upper()*2
    y=Letters(y,x+1)
    y.hello()
print(BB.var)

Dan saya mendapatkan output ini, yang menunjukkan bahwa objek telah dibuat, namun saya tidak dapat mengakses objek BB dan var...

my name is AA and my var is 1
my name is BB and my var is 2
my name is CC and my var is 3
my name is DD and my var is 4
my name is EE and my var is 5
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-103-600f444742c0> in <module>()
     13     y=Letters(y,x+1)
     14     y.hello()
---> 15 print(BB.var)

NameError: name 'BB' is not defined

Ada penjelasan?

-2
London_owl 16 Agustus 2017, 23:37

2 jawaban

Jawaban Terbaik

Anda mencoba menyetel variabel global. Anda dapat melakukan ini menggunakan globals(), seperti:

globals()["AA"] = Letters("AA", 3)

Jadi Anda bisa melakukan ini:

for x in range(n):
    name= chr(x + 97).upper() * 2
    globals()[name] = Letters(name, x + 1)

AA.hello()
print(BB.var)
1
Zweedeend 16 Agustus 2017, 21:04

Dua masalah di sini:

  1. Setiap objek Letters hilang pada iterasi berikutnya dari loop Anda. y adalah objek Letters baru dengan name dan var baru -- y dari iterasi sebelumnya hilang selamanya. Jika Anda ingin menyimpan setiap objek yang Anda buat, Anda harus menggunakan koleksi seperti daftar atau dict.
  2. Pada akhirnya, print(BB.var) mencoba mencetak variabel yang disebut BB, atau lebih khusus lagi atribut var-nya. Tetapi Anda belum pernah membuat variabel dengan nama itu, yang dikatakan NameError: name 'BB' is not defined kepada Anda.

Anda bisa melakukan sesuatu seperti ini sebagai gantinya:

l = [] # new empty list
for x in range(0,n):
    y=chr(x+97).upper()*2
    y=Letters(y,x+1)
    y.hello()
    l.append(y) # add (append) y to the end of l
print(l[1].var) # print 2nd item's `var` which is BB
1
Eric Fulmer 16 Agustus 2017, 21:05