2012-03-09 41 views
0

我創建在Python,然後有一些嵌套類的類添加使用SETATTR()。Python的文檔字符串在子類

class T(object): 
    def __init__(self): 
     cDict = {} 
     cDict['__doc__'] = 'Inner class doc string' 
     setattr(self, 'C', type('C',(), cDict)) 

但是,調用幫助(T)不那麼包括約C.構建T,然後是C內它,做工精細的信息。

這做傳統的方式工作得很好:

class T2(object): 
    class C2(object): 
     __doc__ = 'Inner class doc string' 

調用幫助(T2)顯示有關C2的信息。

有人可以闡明這裏發生了什麼一些輕?謝謝。

回答

0

兩個片段,你表現是不等價的。

此:

class T(object): 
    def __init__(self): 
     cDict = {} 
     cDict['__doc__'] = 'Inner class doc string' 
     setattr(self, 'C', type('C',(), cDict)) 

將設置在每個T實例C屬性:

>>> T.C 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: type object 'T' has no attribute 'C' 
>>> t = T() 
>>> t.C 
<class '__main__.C'> 

這是因爲你放在裏面的__init__ SETATTR。

雖然此:

class T2(object): 
    class C2(object): 
     __doc__ = 'Inner class doc string' 

將上T2本身添加一個屬性:

>>> T2.C2 
<class '__main__.C2'> 
2

help運行在類和類型,而不是對象。但是,您的T僅在對象中有成員C(當運行__init__時)。所以help無法檢測到它。

您的T2還包含C2,因此help檢測到它並顯示正確的信息。

1

第一種方式使C爲每個T對象的實例屬性。

第二種方法導致CT類中的一個屬性。

help(T)T類(以及名稱爲T引用的對象,在本例中是一個類)提供幫助。它無法知道任何關於T的任何給定實例,即使對於每個實例都是如此(反正它可能不會;後來的代碼可以做到my_T = T(); del my_T.C)。