파이썬에서, 나는, 또는 속성의 상태를 변경 메서드 호출을 직접 속성에 할당하여 인스턴스의 상태를 변경할 수 있습니다 나 :파이썬 "호출"속성 (의사 속성)
foo.thing('baz')
이 방식으로 작동하는 속성의 큰 숫자까지 확장 위의 양식을 모두 받아들이 클래스를 만들 수있는 좋은 방법이 있나요? (간단히 말해, 특별히 좋아하지 않는 구현 예를 보여줄 것입니다.) 이것이 바보 같은 API라고 생각하면 알려주세요.하지만 좀 더 구체적인 예가 있습니다. 내가 Document
클래스를 가지고 있다고 가정 해보십시오. Document
의 속성은 title
일 수 있습니다. 그러나 title
도 일부 상태 (글꼴, 글꼴 크기, 자리 표시, ...)를 갖고 싶어 할 수 있지만 평균 사용자는 제목을 문자열로 설정하고 끝내면 만족할 수 있습니다.
다음과 같이
class Title(object):
def __init__(self,text,font='times',size=12):
self.text = text
self.font = font
self.size = size
def __call__(self,*text,**kwargs):
if(text):
self.text = text[0]
for k,v in kwargs.items():
setattr(self,k,v)
def __str__(self):
return '<title font={font}, size={size}>{text}</title>'.format(text=self.text,size=self.size,font=self.font)
class Document(object):
_special_attr = set(['title'])
def __setattr__(self,k,v):
if k in self._special_attr and hasattr(self,k):
getattr(self,k)(v)
else:
object.__setattr__(self,k,v)
def __init__(self,text="",title=""):
self.title = Title(title)
self.text = text
def __str__(self):
return str(self.title)+'<body>'+self.text+'</body>'
이 지금은이를 사용할 수 있습니다 :이 작업을 수행하는 한 가지 방법은하는 것
doc = Document()
doc.title = "Hello World"
print (str(doc))
doc.title("Goodbye World",font="Helvetica")
print (str(doc))
이 구현은 (__special_attr
으로)하지만 좀 지저분 보인다. 이것이 엉망인 API이기 때문에 그럴 수도 있습니다. 나는 잘 모르겠다. 더 좋은 방법이 있나요? 아니면 두드린 경로를이 곳으로 너무 멀리 두었습니까?
이 경우에도 @property
을 사용할 수 있다는 것을 알았지 만,이 방법으로 동작하는 속성이 두 개 이상인 경우에는 확장이 잘되지 않습니다. getter를 작성해야합니다. 각각에 대한 세터.
또한 실제 사용 사례에는 마크 업 언어가 포함되어 있지 않으므로 방금 더 많은 사용자에게 친숙한 예제로 사용했습니다. (제발'elementtree' 또는'xml.favorite.parser'를 사용하지 말아주세요 ...) – mgilson