Python Docstrings в подклассах - PullRequest
0 голосов
/ 09 марта 2012

Я создаю класс в Python, в который затем добавляются вложенные классы с использованием setattr ().

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

Однако вызов help (T) не включает в себя и информацию о C. Построение T, а затем и C внутри него работает нормально.

При этом традиционный способ работает нормально:

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

Вызов справки (T2) отображает информацию о C2.

Может кто-нибудь пролить свет на то, что здесь происходит? Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

help работает с классами и типами, а не с объектами. Тем не менее, ваш T имеет только член C в объектах (когда __init__ был запущен). Так что help не может его обнаружить.

Ваш T2 также содержит C2 в самом классе, поэтому help обнаруживает его и отображает правильную информацию.

1 голос
/ 09 марта 2012

Первый способ заставляет C быть атрибутом экземпляра каждого T объекта.

Второй способ заставляет C быть атрибутом класса T класса.

help(T) предоставляет справку по классу T (ну, объект, к которому относится имя T, в данном случае это класс).Он не может ничего знать ни о каком конкретном экземпляре T, даже если он истинен для каждого экземпляра (и в любом случае это может быть не так; более поздний код может выполнить my_T = T(); del my_T.C).

0 голосов
/ 09 марта 2012

Два показанных вами фрагмента не эквивалентны.

This:

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

установит атрибут C для каждого экземпляра T:

>>> 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'>

Это потому, что вы поместили setattr внутри __init__.

. В то время как это:

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

добавит атрибут к T2 сам:

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