다음과 같이 str 하위 클래스를 작성했습니다.
class URL(str):
def __init__(self, url):
u = normalize_url(url)
print u
super(URL, self).__init__(string=u)
normalize_url()
함수는 URL 인코딩과 같은 작업을 수행하는 데 사용됩니다. 내가 사용할 때까지 모든 것이 괜찮습니다 json.dumps()
. 내 테스트 코드는 다음과 같습니다.
>>> u = URL('https://example.com/path contains space.html')
https://example.com/path%20contains%20space.html
>>> json.dumps(u)
'"https://example.com/path contains space.html"'
json.dumps()
' https://example.com/path%20contains%20space.html '을 제공하지 않은 이유
str
(다른 불변 객체와 마찬가지로) 초기화합니까? __new__
파이썬에서 객체를 구성하는 것은 대략 다음과 같습니다.
inst = cls.__new__(cls, *args, **kwargs)
cls.__init__(inst, *args, **kwargs)
귀하의 예에서을 호출 __init__
했지만 너무 늦었습니다. 객체가 이미 설정되었습니다.__new__
그러나 이것을 고칠 수 있습니다! :
class URL(str):
__slots__ = ()
def __new__(cls, val):
val = val.replace(' ', '%20')
return super(URL, cls).__new__(cls, val)
이제 작동합니다!
>>> x = URL('foo bar')
>>> x
'foo%20bar'
>>> json.dumps(x)
'"foo%20bar"'
내가 가진 __slots__ = ()
불변성을 복원하기 위해 추가 했습니다 str
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다