2011-09-15 2 views
2

여러 개의 중첩 된 매개 변수 그룹을 포함하는 Python 클래스가 있습니다.파이썬 : 어떤 객체의 네임 스페이스를 현재 네임 스페이스로 가져올 수 있습니까?

class MyClass(object): 
    #some code to set parameters 

    def some_function(self): 
     print self.big_parameter_group.small_parameter_group.param_1 
     print self.big_parameter_group.small_parameter_group.param_2 
     print self.big_parameter_group.small_parameter_group.param_3 

매개 변수에 액세스하는 데 필요한 코드를 줄이려고합니다. some_function의 맨 위에 매개 변수 이름 (param_1, param_2, param_3)으로 액세스하려면 어떻게해야합니까? 그리고 some_function뿐만 아니라 모든 메서드에 대해이 바로 가기를 적용하려면 MyClass의 어딘가에 배치해야합니까?

답변

1

init 내부에서는 항상 할 수 있습니다.

self.local_param_1 = self.big_parameter_group.small_parameter_group.param_1 
+0

예를 들어, spg = elf.big_parameter_group.small_parameter_group을 입력하여이 문제를 부분적으로 해결했습니다. 문제를 부분적으로 해결합니다. 이제 spg.param_1 만 입력해야합니다.하지만 spg를 제거 할 수 있는지 궁금합니다. 또한 일반적으로 3 개 이상의 매개 변수가 있으므로 이름을 모두 바꾸면 나를위한 보일러 판입니다. – user517893

+0

@Jakob은 값을 한 번 캐시하고 업데이트를받지 않으며이 메서드를 사용하여 값을 설정할 수도 없다는 점에 유의하십시오. – Davy8

+0

@ Davy8, '값을 한 번 캐시 하시겠습니까? 그것은 문제의 가치가 가변적인지 불변인지에 전적으로 달려 있습니다. 그것을 '설정'하는 것과 동일합니다. –

6

나는

spg = self.big_parameter_group.small_parameter_group 

와 기능을 시작하고 그 약어를 사용합니다. __init__()에서 약어를 정의 할 수 있습니다. 전방에 self으로 어디에서나 사용하고 싶다면 같을 것입니다.

+1

+1하지만, 이것을'__init__'에 넣으면 객체의 크기가 커질 것입니다 (절인 될 때도 증가합니다). –

+0

네, 제 코드에서 그랬습니다. 그게 도움이되고 (대개는 충분합니다.) 약자를 제거 할 수 있다면 여전히 궁금합니다. – user517893

+0

@user는 내 대답의 두 번째 부분을 참조하십시오. 조금 무거워서 문서화하기를 원하지만 작동해야합니다. – Davy8

2

한 가지 방법은 그들 각각의 속성을 만드는 것입니다 :

def __getattr__(self, name): 
    import re 
    p = re.compile('param_[0-9]+') 
    if p.match(name): 
     return getattr(self.big_parameter_group.small_parameter_group, name) 
    else: 
     return super(MyClass, self).__getattr__(name) 

이됩니다

@property 
def param_1(self): 
    return self.big_parameter_group.small_parameter_group.param_1 
@property 
def param_2(self): 
    return self.big_parameter_group.small_parameter_group.param_2 
@property 
def param_2(self): 
    return self.big_parameter_group.small_parameter_group.param_2 

또 다른 더 강력한 미만 명시 적 방법은 방법 그래서 같이 getattr을 무시하는 것 정규 표현식 (param_ [일부 번호])에 지정된 형식과 일치하는 모든 속성에 대한 작업

이 두 가지 방법 모두 self.param_1 등으로 전화를 걸 수 있지만 검색 만하면됩니다.

@param_1.setter 
    def param_1(self, value): 
     print 'called setter' 
     self.big_parameter_group.small_parameter_group.param_1 = value 

또는 getattr 보완하기 위해 : 당신이 속성을 설정하려는 경우 당신은 또한 세터를 만들어야합니다

def __setattr__(self, name, value): 
    import re 
    p = re.compile('param_[0-9]+') 
    if p.match(name): 
     return setattr(self.big_parameter_group.small_parameter_group, name, value) 
    else: 
     return super(MyClass, self).__setattr__(name, value) 

(그래서 오타가있을 수 있습니다 다음을 테스트하지 않았습니다 있지만, 개념이 작동해야 함)

+0

네임 스페이스는 dicts, 클래스 및 함수/메서드가 모두 네임 스페이스 인 단순한 모듈 이상의 것입니다. –

+0

@Ethan 당신이 파이썬에 맞는 것처럼 보입니다. 네임 스페이스가 다른 언어와 동일하다고 가정했습니다.나는 당신이 downvoted 사람인지 모르지만 그렇게한다면 downvote하는 사소한 이유 같다. – Davy8

+0

나쁜 정보가 downvote하는 가장 좋은 이유입니다. 문제를 해결하고 투표를 업데이트하게되어 기쁩니다. –