2015-01-08 3 views
1

많은 수의 (100 개에 가까운) 클래스를 프로그래밍 방식으로 만들고 있는데 클래스의 문서 문자열을 설정할 수 있기를 원합니다. 각 클래스 docstrings은 채워질 특정 부분이있는 동일한 기본 구조를 갖습니다. 클래스를 만들 때 템플릿 문자열을 정의한 다음 클래스 별 인수로 채 웁니다.파이썬 2의 클래스에 대해 __doc__을 설정하십시오.

난 후 나는 무엇을 인위적인 예는 생각으로 내가 help(A)를 호출 할 때 A.__doc__ = class_docstr.format(name="A")이 그래서 내가 이런 걸 볼 수 설정 어떻게 든하고 싶으면 무엇 다음

class_docstr = """ 
This is the docstring for the {name} class. 
""" 


class A(object): 

    def __init__(self): 
     pass 


class B(object): 

    def __init__(self): 
     pass 


class C(object): 

    def __init__(self): 
     pass 

:

class A(__builtin__.object) 
| This is the docstring for the A class. 

이 작업을 수행하기 위해 메타 클래스를 사용해야 할 수도 있다고 생각하지만 어떻게해야할지 모르겠습니다.

+0

... 거의 확실 과잉 인' 메타 클래스의'__new__' 메쏘드 안에있는 클래스 사전의 __doc__ 키를 사용하여 클래스가 실제로 생성되기 전에 이루어져야한다는 것을 명심하십시오. –

+0

클래스 정의를 훑어 보아도 문서를 볼 수있는 분명한 방법이 없기 때문에 문서화 문자열의 목적을 무시할 수 있습니다. 이 방법으로 문서화 문자열을 생성해야하는 이유가 있습니까? – astex

+1

파이썬이나 ipython repl에서 대화식 탐색을 위해 docstring을 더 원하고, 소스를 문서화하지 않고 sphinx를 통해 자동으로 html 문서를 생성하기를 원합니다. – spencerlyon2

답변

3

당신은 클래스 정의 내부의 __doc__ 클래스 변수에 할당하여 문서화 문자열을 설정할 수 있습니다

class A(object): 
    __doc__ = class_docstr.format(name="A") 

    # whatever else 

이 클래스를 만든 후에 A.__doc__에 할당하는, 나중에 작동하지 않는 경우에도, 작동합니다.

+0

위대한/간단한 대답. 내 응용 프로그램에 완벽하게 작동했습니다. – spencerlyon2

0

당신이 정말로 여기에 메타 클래스를 사용하려면, 열심히해서는 안됩니다 ... 말했다와

>>> class Meta(type): 
... def __init__(cls, *args): 
...  super(Meta, cls).__init__(*args) 
...  cls.__doc__ = class_docstr.format(name=cls.__name__) 
... 
>>> class A(object): 
... __metaclass__ = Meta 
... 
>>> A.__doc__ 
'\nThis is the docstring for the A class.\n' 

이 당신은 업데이트 할 수 있습니다

+0

메타 클래스를 사용하고 싶지 않지만 깨끗한 솔루션을 모릅니다. 대안을 제시 할 수 있습니까? Blckknght의 제안인가? – spencerlyon2

+0

물론 가능합니다. 그런 다음 클래스 이름을 두 번 지정해야하지만 이는 세상 끝이 아닙니다. 양자 택일로, 클래스 데코레이터를 만들어 작업을 수행 할 수 있습니다 ... 기본적으로 - 당신은 많은 옵션을 가지고 있고 그것은 단지 당신이 원하는 방법에 달려 있습니다 ... – mgilson

+0

이것은 파이썬 2에서 작동하지 않습니다. 클래스가 생성 된 후에는'__doc__' 변수를 수정할 수 없습니다. 메타 클래스'__new__' 메쏘드로 클래스 딕셔너리에'__doc__' 값을 추가 할 수 있습니다. 그러나 여기에있는 것보다 좀 더 장황합니다. – Blckknght

관련 문제