2017-03-09 13 views
-1

Pythonでは、クラスとインスタンスの両方から、事前定義されていないクラス変数にアクセスすることができます。ただし、あらかじめ定義されたクラス変数(「名前」など)をオブジェクトインスタンスからアクセスすることはできません。私は何が欠けていますか?ありがとう。Python:定義済みのクラスの変数アクセス

ここに書いたテストプログラムです。

class Test: 
     ''' 
     This is a test class to understand why we can't access predefined class variables 
     like __name__, __module__ etc from an instance of the class while still able 
     to access the non-predefined class variables from instances 
     ''' 

     PI_VALUE = 3.14 #This is a non-predefined class variable 

     # the constructor of the class 
     def __init__(self, arg1): 
       self.value = arg1 

     def print_value(self): 
       print self.value 

an_object = Test("Hello") 

an_object.print_value() 
print Test.PI_VALUE    # print the class variable PI_VALUE from an instance of the class 
print an_object.PI_VALUE  # print the class variable PI_VALUE from the class 
print Test.__name__    # print pre-defined class variable __name__ from the class 
print an_object.__name__  #print the pre-defined class varible __name__ from an instance of the class 
+1

クラスとは異なり、インスタンスには定義された名前がないため、 '__name__'はありません。同様に、インスタンスはモジュール内で定義されていないので、 '__module__'はありません。また、インスタンスがあらかじめ定義されたクラス変数にアクセスすることはできません。たとえば、 '__doc__'や' __weakref__'や '__init __()'などのメソッドがあります。 – ekhumoro

+0

ありがとうございます。あなたの説明は明確です。 – RebornCodeLover

答えて

2

これは正常です。クラスのインスタンスは、属性解決のためにそのクラスの__dict__とすべての祖先の__dict__を見ますが、クラスのすべての属性が__dict__から来ているわけではありません。特に

Test__name__むしろクラスの__dict__よりも、クラスを表すC言語の構造体のフィールドに保持され、属性がtype.__dict____name__descriptorを通して見出されます。 Testのインスタンスは、属性ルックアップのためにこれを見ません。

+0

ああ。それは説明します。ありがとう@ user2357112 – RebornCodeLover

0

私は "なぜ"のための素晴らしい答えがありません。 __class__を使用してそれらにアクセスする方法は次のとおりです。

>>> class Foo(object): pass 
... 
>>> foo = Foo() 
>>> foo.__name__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'Foo' object has no attribute '__name__' 
>>> foo.__class__.__name__ 
'Foo' 
>>> 
+1

@ekhumoroとuser2357112の上記の回答をご覧ください。彼らの反応は、なぜfoo .__ class __.__ name__が動作するのかを説明します。 – RebornCodeLover

関連する問題