2017-08-16 5 views
-2

私はPythonの初心者ですので、これは簡単ですが、私は許してください、これまでのところ答えを見つけることができませんでした。このエラーメッセージが表示されるのはなぜですか?クラス__init__関数で作成されたオブジェクトにアクセスすることはできません:

#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) 

そして、私が作成されたオブジェクトを示唆して、この出力を取得、まだ私はBBオブジェクトとその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 

どれ説明?

+1

はい。 'BB'という名前の変数はありません。あなたの 'Letter'オブジェクトの1つに*文字列' 'BB ''に割り当てられた 'name'属性がありますが、ここにもそこにもありません。 –

+0

インスタンスに' name'属性があるという事実値「BB」は、識別子「BB」が存在するか、またはそのインスタンスへの参照であることを意味しません。私はhttps://nedbatchelder.com/text/names.htmlを読むことをお勧めします – jonrsharpe

+3

私はdownvotesが過度に厳しいと思う。質問自体は、典型的な最初の質問よりもはるかに優れています。問題を再現し、エラーメッセージとスタックトレースを提供する小さな自己完結型の例を提供します。 –

答えて

1

グローバル変数を設定しようとしています。だから、あなたがこれを行うことができます

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

:あなたは次のように、globals()を使用してこれを行うことができます

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

AA.hello() 
print(BB.var) 
+0

これは動作します、ありがとうございます。 'for'ループでは、次の行も' globals()[name] .hello() 'に変更する必要がありました また、このグローバル変数の作成は、コード内のどこからでもアクセスできることを意味します。それは私が作成しているオブジェクト以外の場所に配置されていますか?この質問が意味をなさない場合:クラスオブジェクトは、クラスの正式な要件を満たすだけで、クラス内に「配置」されずに、メソッドと変数の特定のセットを単純に連結しますか?再度ありがとう –

1

ここに2つの問題:

  1. Letters各オブジェクトは、次の反復で消えますあなたのループの。 yは新しいとvarの新しいLettersオブジェクトです。前回の繰り返しからのyは永遠に消えています。作成する各オブジェクトを保持したい場合は、リストや辞書のようなコレクションを使用する必要があります。
  2. 最後にprint(BB.var)は、BBという変数、より具体的にはvarという属性を印刷しようとしています。しかし、その名前の変数を作成したことはありません。これはNameError: name 'BB' is not definedがあなたに伝えているものです。

あなたはこの代わりのような何かができる:

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 
+0

1)意味があります。私はオブジェクトが文字列 'y'で指し示されていると思っていたので、ちょっと混乱していました。つまり、各反復でAA、BBなどを指していました。 2)この手順は、作成したリストがグローバルシンボルテーブル内にあるという意味で、Zweedend 'globals()[name]'によって与えられたものと等価ですか? –

関連する問題