2017-02-17 9 views
1

일부인 경우 변수를 나타내는 문자열 [ 'foo1', 'foo2', ...]이 있습니다. 본인. 이것을하기위한 Pythonic과 Compact 한 방법은 무엇입니까?목록에 존재하는 경우 변수를 자가용에서 삭제하는 Pythonic 방법

내 첫 번째 시도는

if hasattr(self, 'foo1'): 
    del self.foo1 
if hasattr(self, 'foo2'): 
    del self.foo2 
... 

그러나 이것은 분명히 큰 목록에 대한 확장 성이 없습니다.

아무도 도와 줄 수 있습니까?

+0

같은 당신이 원하는 것을 할 수 있습니까? – Kevin

+0

가능한 [Python - 어떻게 동적으로 클래스에서 메서드를 제거 할 수 있습니다 - 즉 setattr의 반대편 (http://stackoverflow.com/questions/16700958/python-how-can-i-dynamically-remove-a) -method-from-a-class-ie-opposite-of) – farsil

+0

@Kevin 초기화 된 후에 수정할 수있는 클래스가 있습니다 (초기화가 계산 상 비쌉니다). 수정 방법에 대한 특정 규칙이 있습니다.자기 자신을 삭제하는 내 동기는 클래스가 잘못 수정되어 이러한 변수/객체가 더 이상 유효하지 않은 경우 클래스의 변수/객체를 파괴하는 것이 었습니다. 아마, 나는 그 반을 부모와 자식으로 나누어야한다. – RoachLord

답변

8

당신은 for 루프를 사용 할 수 있습니다 개체의 __dict__pop를 사용하여 동시에 부스트 성능에서 :

for attr in ('foo1','foo2'): 
    self.__dict__.pop(attr,None) 

pop 기본적 요소는 사전 및 제거합니다에 체크입니다 않는지 그 경우 (해당 값을 반환하지만 여기서는 관련이 없습니다). 여기에 None을 "기본"반환 값으로 사용하여 키가 존재하지 않으면 pop은 오류가 발생하지 않습니다.

+1

'dict'도'pop' 방법을 가지고 있다는 것을 몰랐습니다. – Kevin

+1

나는이 해결책을 좋아한다! – Bodao

0

루프로 실행 하시겠습니까?

var_names = ["foo1", "foo2", "foo3"] 
for var_name in var_names: 
    delattr(self, var_name) 
0

개체의 속성을 유용 삭제 어디 많은 경우에 생각할 수는 없지만, delattr()있다.

5

delattr을 사용할 수 있습니다. 속성이 존재하지 않는 경우는 AttributeError을 올릴 것이다, 그래서 당신은 당신이 원하는 경우에 방법을 포장 할 수 있습니다

def safe_delattr(self, attrname): 
    if hasattr(self, attrname): 
     delattr(self, attrname) 

또는 try/except 블록을 사용 : 이것은 장점이있다

try: 
    delattr(self, attrname) 
except AttributeError: 
    pass 

그들은 __dict__ 속성을 노출시키지 않으므로 __slots__을 정의하는 클래스로 작업해야합니다.

+2

또는 '시도해보십시오 ... ...; [EAFP] (http://stackoverflow.com/questions/12265451/ask-forgiveness-not-permission-explain)에 대한 AttributeError : ...를 제외하고. –

1

이와 비슷한 것이 있습니까?

def del_attr(self, list): 
    for l in list: 
     delattr(self, l) 
2

아주 쉽게 할 수 있지만, 꽤 이상한 요구 사항처럼 보이는 것 같습니다. 일반적으로 파이썬에서 동적 생성 및/또는 변수 삭제를 포함하는 모든 것이 코드 냄새이므로 요구 사항이 어떻게 나타나는지 (그리고 설명이 실제 문제를 왜곡하지 않을 수도 있음)에 관심이 있습니다.

그러나

해당 인스턴스 변수는 self.__dict__에 저장되어있는 기억, 그리고 문자열의 목록이 호출 될 것을 가정 los 당신은 당신이 할 싶어 왜

for s in los: 
    if s in self.__dict__: 
     del self.__dict__[s] 
+1

'pop()'을 사용하는 WillemVanOlson의 솔루션이 우월하다는 점에 유의하십시오. – holdenweb