2013-03-18 4 views
1

클래스의 생성자는 종종 인수를 가져 와서 인스턴스에 저장합니다. 자동으로 생성자 인수 저장

  • 이 특정 클래스 또는 실패합니다 다음과 같이
    from inspect import getargspec 
    def save_args(values): 
        for i in getargspec(values['self'].__init__).args[1:]: 
         values['self'].__dict__[i] = values[i] 
    
    class Example(object): 
        def __init__(self, title='',backtitle='', height=20, width=50): 
         save_args(vars()) 
    

    내 질문

    은 예를 들어 : 나는이 작업을 자동으로 할 수있는 도우미 함수를 만들 수 있도록

    class Example(object): 
        def __init__(self, title='',backtitle='', height=20, width=50): 
         self.title = title 
         self.backtitle = backtitle 
         self.height = height 
         self.width = width 
    

    이 반복적이다 기구들

  • 자이 썬에서 동작 할까? 파이썬 2.7과 3.2에서 나를 위해 일했다.
  • 더 간단한 대안이 있습니까?
  • 이미 파이썬 패키지가 있습니까?

답변

4

클래스에서 __slots__을 사용하면 오류가 발생합니다. 대신 setattr()을 사용할 수

from inspect import getargspec 
def save_args(values): 
    for i in getargspec(values['self'].__init__).args[1:]: 
     setattr(values['self'], i, values[i]) 

물론 모든 선언 슬롯입니다 __init__에 인수를 키워드 인자를 제공했다.

그렇지 않으면 모든 Python 구현에서 작동합니다.

previous discussion of the topic에 관심이 있으실 것 같아서 Python-ideas list thread이 발생했습니다.

+0

FGITW을 - 그건 실제로 첫 번째 것이 중요 할 때 개별적으로 OP 질문을 개별적으로 다루려고 시도 할 때 얻은 것입니다. – mgilson

+0

지난 6 개월 동안 어딘가에 파이썬 아이디어에 대한 토론이있었습니다. 사람들은 300 가지의 다른 구현을 제안하고 논쟁했습니다. 정말로 관심이 있다면 아카이브를 검색해 볼 가치가 있습니다. (IIRC, 당신이 이식성에 신경 쓰지 않는다면,'getargspec'이 할 수없는 몇 가지 경우를 처리하는 프레임 해커를 사용하는 해결책이 있습니다. 그러나 어떤 경우인지 기억하지 못합니다.) – abarnert

+0

이것은 메타에서 깔끔하게 처리 될 수도 있습니다 -class는 기존의'__init__'을 감싸고 있지만, 내 머리 속에서 작동하는 방법을 완전히 형성하지는 못했지만 (대개 나는 메타 클래스로 경험이 거의 없기 때문에) – mgilson

0

이 자동으로 예 생성자에 대한 모든 잘못된 인수를 무시하고, 더 많은 코드를 작성할 필요하며, 예 생성자에 위치 인수를 지원하지 않지만 inspect의 사용을 피할 수 :

def save_args(obj, defaults, kwargs): 
    for k,v in defaults.iteritems(): 
     if k in kwargs: v = kwargs[k] 
     setattr(obj, k, v) 

class Example(object): 
    def __init__(self, **kwargs): 
     defaults = { 'title': '', 
        'backtitle': '', 
        'height': 20, 
        'width': 50 } 
     save_args(self, defaults, kwargs) 
+1

'inspect'의 문제점은 무엇입니까? 못생긴 것들이 충분히 숨겨져있는 한, 나는 아무런 문제가 보이지 않는다. – mgilson

+0

'inspect'에 아무런 문제가 없으며, 그저 할 수 있다는 것을 보여주고 싶었다. – zwol