2011-11-16 4 views
4

동적으로 일부 클래스를 생성하고 다른 docstring을 갖기를 원합니다. 나는 가지고있다 :동적 유형의 docstring을 Python 3으로 설정하기

def make_class(class_docstring): 
    class X: 
     pass 
    X.__doc__ = class_docstring 
    return X 

docstrings은 읽기 전용이므로 작동하지 않는다. 그런 다음 시도했습니다 :

super을 호출해야합니다.

docstring 속성을 동적으로 설정하는 올바른 방법은 무엇입니까?

+0

첫 번째 접근 방식은 완벽하게 작동합니다. 왜 doc 문자열은 읽기 전용이라고 생각합니까? 그들은 그렇지 않습니다. –

+0

즉, 적어도 Python 2.x에서. 파이썬 3을 사용하고 있습니까? –

+0

@SvenMarnach : 예, Python 3입니다. –

답변

5

클래스 내에 문서 문자열을 설정할 수 있습니다.

>>> def make_class(class_docstring): 
...  class X: 
...   __doc__ = class_docstring 
...  return X 
... 
>>> x = make_class('test doc') 
>>> x 
<class '__main__.X'> 
>>> xx = x() 
>>> xx.__doc__ 
'test doc' 

두 번째 시도가 실패하는 이유를 모르겠습니다.

+0

'super()'에 대한 호출이'X' 형 ('super (X)'로 변환 됨)에 바인딩되어 메소드가 복사되기 때문에 두 번째 시도가 실패합니다 '__mro__'에'X'가없는 동적으로 생성 된 유형으로 변환합니다. –

+0

'name = make_class '대신에'make_class ('name ','docstring ')를 쓸 수 있도록'return X' 대신'globals() [class_name] = X''를 사용하는 것이 좋을까요? (...'?? –

+1

@NeilG : 그것은 효과가있을 수 있지만, 전역에 물건을 주입하는 것은 거의 항상 나쁜 습관입니다. 'name = ...'을 사용하는 것이 훨씬 명확합니다. –

관련 문제