2017-10-23 7 views
0

私はユーザーから名前を取得するシンプルなクラスAを持っています。別のクラスのクラス変数にアクセスする

class A: 
    def __init__(self, name = ''): 
     self.name = name 

次に、この名前を印刷するクラスBを作成します。私が試した:

class B: 
    def print_name(printing_name = A.name): 
     print(printing_name) 

は、その後、私はこれらのメソッドを呼び出す:これは

Traceback (most recent call last): 
    File "so.py", line 5, in <module> 
    class B: 
    File "so.py", line 7, in B 
    def print_name(printing_name = A.name): 
AttributeError: class A has no attribute 'name' 

は私がクラスAのクラス変数を割り当てていなかったことを知っているエラーを返します

m1 = A("x") 
B.print_name(m1) 

をし、したがって、name属性は、クラス全体ではなく、特定のインスタンスになります。ただし、name属性は、大文字と小文字が異なるため、すべての特定のインスタンスに接続する必要があります。では、クラスBでこの名前をどうすればいいですか?

+1

は 'ここself.name'は、インスタンスのプロパティではなく、クラス属性です。ここで何を達成しようとしましたか? –

答えて

3
があなたの class Bこれに変更し

class B: 

    @staticmethod 
    def print_name(obj): 
     print(obj.name) 

print_name方法は、おそらく"static method"ように装飾されなければなりません。 「name」のselfは、クラス自体から直接参照することができないインスタンス属性です。

+0

これはあなたです。ありがとう! – vivi11130704

0

この例では、Aはクラスの名前であり、print_nameメソッドを呼び出すためのデフォルト引数として渡すべきではありません。 Pythonのキーワード引数を見てみましょう。実際に書いたことは、クラスAの.nameプロパティにデフォルト値が設定されていることを意味します。クラスがインスタンス化されていなければ存在しません。クラスの作成)。

あなたBクラスには、次のようになります。

class B: 
    def print_name(printing_object): 
     print(printing_object.name) 
1

正しいこと:はクラス属性ではなくインスタンス属性です。この場合、m1には名前がありますが、クラスAはありません。入力パラメーターの名前にアクセスする必要があります。クラス属性を出力しようとはしません。あなたはBのインスタンスからそれを呼び出していないので、

はまた、B.print_nameクラスの関数を作成する必要があります。

class B: 

    @staticmethod 
    def print_name(inst): 
     print(inst.name) 

出力:

x 
+0

今すぐ取得します。ありがとうございました! – vivi11130704

1

編集:あなたはそれが何をするか理解していれば@staticmethodを示唆答えは理想的です。

class A: 
    def __init__(self, name = ''): 
     self.name = name 

class B: 
    def __init__(self): 
     pass 
    def print_name(self, var): 
     print (var.name) 

出力:

>>> m1 = A("X") 
>>> b = B() 
>>> b.print_name(m1) 
X 
>>> 
関連する問題