이전 파이썬 코드를 변환하고 일부 클래스를 새 스타일 클래스로 바꿨습니다. 문제는 이것이 __str__
을 대체하는 행동을 위반하고 나는 그 이유를 모른다는 것입니다. 새 스타일 클래스에서 __str__ 바꾸기
class OldStyle():
def __str__(self):
return 'original'
old = OldStyle()
print old
old.__str__ = lambda: 'modified'
print old
class NewStyle(object):
def __str__(self):
return 'original'
new = NewStyle()
print new
new.__str__ = lambda: 'modified'
print new
나는
original
modified
original
modified
을 예상하지만,
__str__
올바르게 새로운 스타일로 대체되지 않은됩니다
original
modified
original
original
을 얻었다.
new.__str__
은 새 람다를 올바르게 반환하지만
str(new)
은 여전히이 람다를 호출하지 않습니다. 나는 이것이 어떤 메소드 룩업 캐싱 문제라고 생각했지만, 객체가 이전에 결코 인쇄되지 않았더라도 이런 일이 발생한다.
왜 이런 일이 발생합니까? 나는이 동작의 차이에 대해 들어 본 적이 없으며 __str__
에서만 발생하며 다른 메서드는 잘 대체됩니다.
마지막 수정을'NewStyle .__ str__ = lambda self : 'modified''로 바꾸는 것은 예상대로 작동합니다. 나는 이전과 새로운 스타일의 클래스에서 메소드 해석 순서가 다르다고 생각한다. –
흥미 롭습니다. 문제는 그 단일 인스턴스에서만'__str__'을 대체해야한다는 것입니다. 나는 그것을 다른 방식으로 구현할 수 있다고 생각하지만 호기심이 생겼다. – BoppreH
호기심에서, 처음에 인스턴스에서'__str__' 코드를 대체하는 이유는 무엇입니까? 소리 ... 못 생겼어. – geoffspear