2011-02-19 4 views
7

self (일부) __init__ 메소드의 인수에 자동으로 바인딩하는 방법이 있습니까? 대신자동 바인딩을위한 파이썬 데코레이터 __init__ 인수

class Person: 
    @lazy_init 
    def __init__(self, name, age, address): 
     ... 

... : 사람들이 이미 이러한 경우에 사용하는 것이 비슷한이 궁금

class Person: 
    def __init__(self, name, age, address): 
     self.name = name 
     self.age = age 
     self.address = address 
     ... 

내가 좋아하는 뭔가를 의미한다. 아니면 처음부터 이런 식으로하지 말아야 할 이유가 있습니까? 당신이 속성에 매핑 속성 이외의 무언가를 가지고 시작하면, 당신은 비록 문제로 실행하는거야

def lazy_init(init): 
    import inspect 
    arg_names = inspect.getargspec(init)[0] 

    def new_init(self, *args): 
     for name, value in zip(arg_names[1:], args): 
      setattr(self, name, value) 
     init(self, *args) 

    return new_init 

class Person: 
    @lazy_init 
    def __init__(self, name, age): 
     pass 

p = Person("Derp", 13) 
print p.name, p.age 

:

답변

4

그것은 여기에 다소 순진 구현 확실히 가능합니다. 속성으로 초기화 할 args를 지정하는 데는 적어도 어떤 방법이 필요합니다 ... 어느 시점에서이 옵션은 가치가있는 것보다 더 번거롭 게됩니다.

+0

감사합니다. 만약''__init__' 메서드가 정교하다면 그만한 가치가 있지 않을 것입니다. 그러나 간단한 것들은 매우 광범위하게 퍼져있어서 그와 비슷한 것을 갖는 것이 좋을 것이라고 생각합니다. –

0

를 참조하십시오

def lazy_init(*param_names): 
    def ret(old_init): 
    def __init__(self, *args, **kwargs): 
     if len(args) > len(param_names): 
     raise TypeError("Too many arguments") 
     for k in kwargs: 
     if k not in param_names: 
      raise TypeError("Arg %r unexpected" % k) 
     for par, arg in zip(param_names, args): 
     setattr(self, par, arg) 
     for par, arg in kwargs.items(): 
     setattr(self, par, arg) 
     old_init(*args, **kwargs) 
    return __init__ 
    # 
    return ret 


class Q(object): 
    @lazy_init("a", "b") 
    def __init__(self, *args, **kwargs): 
    print "Original init" 

>>> q = Q(1, 2) 
Original init 
>>> q.a, q.b 
(1, 2) 

이 너무 __str__를 커버 할 수있는 수준의 장식을 고려하십시오.

0

나에 의해 만들어진 initify.py : 그것은 정확히 당신이 기대하는 것입니다.

class Animal: 
    @init_args(exclude=["name"]) 
    def __init__(self, name): 
     pass 

또는 기본값

: 상속 제외

class Animal: 
    @init_args 
    def __init__(self, name="Default name"): 
     pass 

또는 :

class Dog(Animal): 
    @init_args(exclude=["name"]) 
    def __init__(self, species): 
     pass 

https://github.com/prankymat/initify.py

관련 문제