2016-07-25 2 views
4

두 속성 (file_pathsave_path)이있는 개체가 있습니다. save_path이 명시 적으로 설정되지 않은 한 file_path과 동일한 값을 지정합니다.'__setattr__`을 (를) 사용해야합니까, 아니면 ...?

내가이 작업을 수행하는 방법을 생각 는 다음과 같은 뭔가, __setattr__ 함께 :

class Class(): 
... 
    def __setattr__(self, name, value): 
     if name == 'file_path': 
      self.file_path = value 
      self.save_path = value if self.save_path == None else self.save_path 
     elif name == 'save_path': 
      self.save_path = value 

그러나이 속성이 설정 될 때마다 호출 __setattr__ 때문에 나에게 무한 루프를 줄 것 같은이 보인다 . 그래서, 위의 글을 쓰고 그것을 피하는 적절한 방법은 무엇입니까?

답변

3

이것은보기에 좋지 않습니다. 속성 만 사용할 수 있습니다. 코드 세 줄 :

>>> class Class: 
...  def __init__(self, file_path, save_path=None): 
...   self.file_path=file_path 
...   self.save_path = save_path or file_path 
... 
>>> c = Class('file') 
>>> c.file_path 
'file' 
>>> c.save_path 
'file' 

>>> c1 = Class('file', 'save') 
>>> c1.file_path 
'file' 
>>> c1.save_path 
'save' 
>>> 
+0

'save_path'와'file_path'가 변경 가능할 필요가 없다면, 아마도 이런 식으로 할 수 있습니다. 그들이 변경 가능해야한다면, 그렇게 잘 작동하지 않습니다. – user2357112

+0

나는 같은 생각을 가지고 있었지만 덜 조직적이었습니다. 위의 내용은'file_path'로 시작한 것이 아니라'save_path'가 아니라, 나중에'file_path'를 갱신 한 것으로 보입니다. 아마도 유스 케이스가 필요하지 않을 것입니다. 그것에 대해 생각해야 할 것입니다. – Chuck

+0

@Chuck 귀하의 질문은 당신이 항상 file_path를 가지지 만 때로는 save_path라는 것을 의미합니다. 하나 또는 다른 것이 있으면, 가지고있는 것을 각각 설정할 수 있습니다. 하지만 둘 다 없으면 어떡하지? 그런 다음 기본값 인 –

9

첫째, 속성 될이 작업을 수행하는 가장 쉬운 방법 : 당신이 이제까지 자신이, 당신이 우회하기 위해 __setattr__ 내부 super(Class, self).__setattr__을 사용해야합니다 __setattr__을 쓸 필요 발견하면,

class Class(object): 
    def __init__(self, ...): 
     self._save_path = None 
     ... 
    @property 
    def save_path(self): 
     if self._save_path is None: 
      return self.file_path 
     else: 
      return self._save_path 
    @save_path.setter 
    def save_path(self, val): 
     self._save_path = val 

둘째로 당신의 __setattr__ 및 속성을 정상적인 방법으로 설정하여 무한 재귀를 피하십시오.

+1

위대한 직업! 코멘트를 추가하기 전에 잠깐 고쳤습니다 Comment_ :) – ForceBru

1

super! 먼저 호출해야 self.save_path, 또는 super에 대한 호출이 발생하지만 경우에 설정되지 않았기 때문에 실패 할 것하고 self.save_path or value을 찾습니다 - 거기에이 특정 구현에 한계가 있다는

class Class:               
    def __init__(self):             
     self.save_path = None           
     self.file_path = None           

    def __setattr__(self, name, value):         
     super().__setattr__(name, value)        
     if name == 'file_path':           
      super().__setattr__('save_path', self.save_path or value) 

c = Class()                
c.file_path = 42              
print(c.file_path)              
print(c.save_path)  

주 .

아마도 개인적으로 속성 기반 접근 방식을 사용합니다.

+0

명시 적으로 설정된 'save_path'와'file_path'를 설정하여 암시 적으로 설정된 것을 구별 할 수 없기 때문에 이것은 제대로 작동하지 않습니다. 'file_path'를 두 번 설정하면'save_path'는 첫 번째 값을 유지합니다. – user2357112

+0

아. 음, 만약 * *가 여러분의 요구 사항의 일부라면'__getattr__'도 필요합니다. 또는 훨씬 더 깨끗한 속성 기반 접근법을 사용하는 것. –

관련 문제