2016-12-13 54 views
2

當我在Python中打印內部類時,爲什麼它會打印,就好像它是模塊變量(__main__.FInner),而不是打印爲__main__.F.FInner或嵌套的東西?爲什麼打印內部類打印就好像它是一個模塊的變量?

class F(object): 

    class FInner: 
     x = 1 


x = F() 
print x.FInner # __main__.FInner 

,甚至如果我使用較新的風格內部類風格輸出保持類似

class F(object): 

    class FInner(object): 
     x = 1 


x = F() 
print x.FInner # <class '__main__.FInner'> 
+2

你爲什麼要嵌套類?爲什麼內部類是舊式類? – jonrsharpe

+0

我正在使用https://django-tastypie.readthedocs.io/en/latest/。它建議在老式的fasion中添加一個名爲Meta的內部類 –

回答

3

這是因爲在Python中__repr__()方法類(或object也許?)簡單地顯示module.ClassName默認。因此,Foo類將顯示爲module.Foo,無論它嵌套在例如其他類中如何嵌套,因爲它仍在module中。

如果直接執行腳本,module__main__,但如果你輸入你的類在另一個模塊,它會顯示爲my_module.ClassName代替 - 再次,不管如何嵌套它。

此方法返回的字符串爲__repr__()的文檔(上面鏈接)說:

重要的是,表示是信息豐富和明確的

在這樣的情況以下:

>>> class Foo(object): 
...  class Bar(object): 
...    class Baz(object): 
...      pass 
... 
>>> Foo.Bar.Baz 
<class '__main__.Baz'> 

<class '__main__.Baz'>肯定不是很「信息豐富」,也不是unambiguou s,因爲名爲Baz的頂級類將具有完全相同的__repr__()字符串。然而,Python中的嵌套類非常罕見,至少在我的經驗中。即使在嵌套類的情況下,任何重要信息都可能來自類的屬性或它所繼承的類,而不是它所佔用的名稱空間。我當然可以理解你的好奇心。