2016-06-30 3 views
3

Предположим, у меня есть класс, как это:Как я могу получить docstring для свойства экземпляра класса Python?

class TestCase(object): 
    """Class docstring""" 

    def meth(self): 
     """Method docstring""" 
     return 1 

    @property 
    def prop(self): 
     """Property docstring""" 
     return 2 

Это достаточно легко для меня, чтобы получить строки документации для самого класса, или для обычного метода:

tc = TestCase() 

print(tc.__doc__) 
# Class docstring 

print(tc.meth.__doc__) 
# Method docstring 

Однако этот подход Безразлично» т работа для свойств - вместо этого я получаю атрибут любого объекта возвращаются методом свойства геттерного __doc__ (в данном случае, int):

print(tc.prop.__doc__) 
# int(x=0) -> int or long 
# int(x, base=10) -> int or long 
# ... 

То же самое относится к getattr(tc, "prop").__doc__ и getattr(tc.prop, "__doc__").

Я знаю, что механизмы самоанализа Python способны получить доступ к документированной строке, которую я ищу. Например, когда я называю help(tc) я получаю:

class TestCase(__builtin__.object) 
| Class docstring 
| 
| Methods defined here: 
| 
| meth(self) 
|  Method docstring 
| 
| ---------------------------------------------------------------------- 
| Data descriptors defined here: 
| 
| __dict__ 
|  dictionary for instance variables (if defined) 
| 
| __weakref__ 
|  list of weak references to the object (if defined) 
| 
| prop 
|  Property docstring 

Как help может получить доступ к строке документации для tc.prop?

ответ

6

Вы пытаетесь получить доступ к __doc__ из экземпляра, который попытается выполнить сначала, оценить свойство, для которого возвращаемое значение может не иметь атрибута __doc__ или использовать возвращаемый тип __doc__.

Вместо этого, вы должны получить доступ к __doc__ для property из самого класса:

TestCase.prop.__doc__ 

Так, чтобы расширить это экземпляр класса, вы бы использовать __class__, чтобы получить класс экземпляра, а затем свойство и, наконец, __doc__:

tc.__class__.prop.__doc__ 

Или использовать type принести класс:

type(tc).prop.__doc__ 
+1

Для экземпляра 'TestCase' мне нужно будет использовать' tc .__ class __. Prop .__ doc__' или 'type (tc) .prop .__ doc__', но вы правы. –

+0

@ali_m Спасибо. Работая над этим! –

Смежные вопросы