2017-03-09 109 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

謝謝@ekhumoro。你的解釋具有一定的意義。 – RebornCodeLover

回答

2

這很正常。類的實例在該類的__dict__中查找所有祖先的屬性解析以及__dict__,但不是所有類的屬性都來自其__dict__

特別地,Test__name__是在字段中保持在C結構代表類,而不是在類的__dict__,並且屬性是通過在一個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