2012-11-19 5 views
4

가능한 중복 :
Assign function arguments to `self`일반적인 생성자

가 종종 내가 같이 생성자가 다음

class Foo(object): 
    def __init__(self,a,b,c): 
    self.a = a 
    self.b = b 
    self.c = c 

이 있다면 궁금 해서요 이와 같은 생성자를 인코딩하는 편리한 방법. 아마도 다음과 같이 보이는 것일 수 있습니다 :

class Foo(object): 
    SOME_MACRO_LIKE_THINGY_THAT_SPECIFIES_THE_CONSTRUCTOR(a,b,c) 

정확히 원래의 코드와 비슷합니다.

원래 버전의 버그는 필자가 Foo의 각 인스턴스 변수를 세 번 (인수로 한 번, 한 번은 self.a로, 또 다시 한 번 self.a에 할당 할 값으로) 써야한다는 것입니다.

나는 그다지 큰 거래가 아니라고 생각하지만, 코드가 더 적은 반복으로 더 깔끔하게 보일 것이라고 생각합니다.

이 상황을 처리하는 Pythonic 방식은 무엇입니까?

당신이 즉, 마스터 클래스의 서브 클래스로 Foo 모든 다른 사람을 만들 수
+3

솔직하게 나는 원래의/표준/표준 방식을 좋아합니다. 매일 수십 번 본다. 나는 그것이 어떻게 작동하고 그것이 무엇을하는지 정확히 안다. 이것은 여분의 추상화가 코드의 가독성을 크게 떨어 뜨리는 장소 인 IMO입니다. 지금 나는 놀라운 일을하기 위해 파이썬 매직을 뛰어 넘을 수있는 매크로를 파헤쳐 야합니다. –

답변

2

이 이상 해요,하지만 당신이 달성하기 위해 __slots__을 사용할 수

def autoargs(l): 
    self = l.pop('self') 
    for k,v in l.items(): 
     setattr(self, k, v) 

class Base(object): 
    def __init__(self, a, b, c): 
     autoargs(locals()) 

: 인수의 많은 클래스를 초기화 할 때

class Base(object): 
    def __init__(self, *args, **kw): 
     for k,v in zip(self.__slots__, args): 
      setattr(self, k, v) 

     for k,v in kw.items(): 
      setattr(self, k, v) 

class ChildA(Base): 
    __slots__ = 'a', 'b', 'c' 

class ChildB(Base): 
    __slots__ = 'x', 'y', 'z' 

또한 자신에게 약간의 입력을 저장하기 위해 다음과 같은 방법을 사용할 수 있습니다 나는 당신의 질문을 정확하게 이해하기를 바랍니다.

+0

플래시백 :'autoargs' 스 니펫은 [O'Reilly 's Python Cookbook, Second Edition] (http://shop.oreilly.com/ product/9780596007973.do) - Python 2.3 및 2.4를 다루는 이상 놀랍도록 관련성이있는 훌륭한 책. – gvalkov

2

,

class MasterObject(object): 
    def __init__(self,a,b,c): 
    self.a = a 
    self.b = b 
    self.c = c 


class Foo(MasterObject): 
    def __init__(self,a,b,c): 
    MasterObject.__init__(a,b,c) 
+1

또는'** kwargs'와'setattr'을 사용하십시오 ... 아, 이것은 슬프게 만듭니다. –

+0

사실, 이것은 확실히 더 일반적 일 수 있지만 개념은 여전히 ​​동일합니다 –

0

class Foo(object): 
    def __init__(self, **kw): 
     self.__dict__.update(kw) 
     del self.__dict__["self"] 

뭔가를 할 수 있지만 당신은 모든 인스턴스 변수의 이름을 지정해야 클래스를 인스턴스화 할 때마다 나는 이것이 코드를 더욱 허약하게 만든다고 생각한다. 대부분의 사람들은 깨지기 쉬운 코드를 좋아하지 않으므로 명시적인 버전을 사용합니다.

편집기를 확장하기 위해 매크로를 작성할 수도 있지만 매우 많은 시간이 그 세부 사항에 소요된다고는 생각하지 않으며 모든 클래스가 모든 인수를 인스턴스에 저장하지는 않습니다.