__del__ 메서드는 무엇이며 어떻게 부르나요?
메서드가 정의된 클래스를 보았습니다.이 메서드는 클래스의 인스턴스를 삭제하는 데 사용됩니다.하지만 저는 이 방법을 사용하는 곳을 찾을 수 없습니다.이 방법은 어떻게 사용됩니까?그런 식으로:obj1.del()
?.
어떻게 부를까요?__del__
방법?
__del__
최종 결정자입니다.개체에 대한 모든 참조가 삭제된 후 특정 시점에 발생하는 개체 가비지 수집 시 호출됩니다.
단순한 경우에 이것은 당신이 말한 직후일 수 있습니다.del x
또는, 만약x
함수가 종료된 후 로컬 변수입니다.특히 순환 참조가 없는 한 CPython(표준 Python 구현)은 즉시 *가비지 수집을 수행합니다.
그러나 이것은 CPython의 구현 세부사항입니다.Python 가비지 컬렉션에 필요한 유일한 속성은 모든 참조가 삭제된 후에 발생한다는 것입니다. 따라서 이러한 속성은 직후에 발생할 필요가 없고 전혀 발생하지 않을 수도 있습니다.
더욱이, 변수는 여러 가지 이유로 인해 오랫동안 존재할 수 있습니다. 예를 들어, 전파 예외 또는 모듈 검사는 변수 참조 카운트를 0보다 크게 유지할 수 있습니다.또한 변수는 참조 주기의 일부가 될 수 있습니다. 가비지 수집 기능이 설정된 Cython은 이러한 주기를 모두가 아닌 대부분의 중단 시간과 주기적인 중단 시간을 가집니다.
실행된다는 보장이 없기 때문에 실행해야 하는 코드를 입력해서는 안 됩니다.__del__()
이 는 대신, ▁the에 .finally
의 절try
또는 설명with
진술.그러나 다음에 대한 유효한 사용 사례가 있습니다.__del__
예를 들어, 대상인 경우X
Y
그리고 또한 복사본을 보관합니다.Y
세서의참에서 .cache
(cache['X -> Y'] = Y
( )에 가 될 것입니다.X.__del__
캐시 항목도 삭제합니다.
소멸자가 (위 지침을 위반하여) 필수 정리를 제공한다는 것을 알고 있는 경우에는 방법으로 특별한 것이 없으므로 직접 정리를 호출하는 것이 좋습니다.x.__del__()
두 번 호출할 수 있다는 것을 알고 있는 경우에만 그렇게 해야 합니다.또는 마지막 수단으로 다음을 사용하여 이 방법을 재정의할 수 있습니다.
type(x).__del__ = my_safe_cleanup_method
참조:
Cython 구현 세부 사항: Cython은 현재 주기적으로 연결된 가비지의 (선택 사항) 지연 탐지와 함께 참조 카운팅 체계를 사용합니다. 이는 대부분의 개체가 도달할 수 없게 되는 즉시 수집됩니다. [...] 다른 구현은 다르게 작동하고 CPython이 변경될 수 있습니다.
저는 다른 질문에 대한 답을 적었는데, 이것이 더 정확한 질문입니다.
여기 약간 신중한 답변이 있습니다.
사용하지 __del__
이것은 C++이나 파괴자를 위해 만들어진 언어가 아닙니다. 그__del__
방법은 Python 3.x에서 사라져야 하지만, 누군가는 말이 되는 사용 사례를 찾을 것이라고 확신합니다.을 사용해야 할 수.__del__
http://docs.python.org/reference/datamodel.html 에 따라 기본적인 제한 사항을 알고 있어야 합니다.
__del__
때됩니다. 를 할 때 됩니다. 개체에 대한 마지막 참조를 잃어버릴 때도, 실행할 때도 호출되지 않습니다.del object
.__del__
는 임의의 전를건있습다니로 을 합니다.__del__
법정리 MRO(method resolution order)인지 아니면 각 슈퍼클래스를 호출하는지는 명확하지 않습니다.- 가지고 있는 것.
__del__
가비지 수집기가 링크된 목록에 대한 마지막 참조를 잃는 것과 같이 순환 링크를 탐지하고 치료하는 것을 포기함을 의미합니다.gc.gar비지에서 무시되는 개체 목록을 가져올 수 있습니다.약한 참조를 사용하여 주기를 모두 방지할 수도 있습니다.이것은 때때로 논쟁의 대상이 됩니다. http://mail.python.org/pipermail/python-ideas/2009-October/006194.html 을 참조하십시오. - 그
__del__
함수는 커닝을 수행하여 개체에 대한 참조를 저장하고 가비지 수집을 중지할 수 있습니다. - 명적으제예된에서 된 예외
__del__
무시됩니다. __del__
어보__new__
더 많은__init__
이거 헷갈리네요.설명 및 gotchas는 http://www.algorithm.co.il/blogs/programming/python-gotchas-1-del-is-not-the-opposite-of-init/ 를 참조하십시오.__del__
파이썬에서 "잘 사랑받는" 아이가 아닙니다.종료하기 issue.sys.exit()이 을 알 수 .에__del__
글로벌에서 이상한 주문 문제(예: http://bugs.python.org/issue5099 )가 발생합니다.할까__del__
전화가 왔음에도 불구하고.__init__
실패? 긴 스레드는 http://mail.python.org/pipermail/python-dev/2000-March/thread.html#2423 을 참조하십시오.
하지만, 다른 한편으로는:
__del__
종결 진술을 하는 것을 잊지 않는다는 것을 의미합니다.전문가는 http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/ 를 참조하십시오.__del__
ㅠㅠ 으로 ctype 기타 하는 것에 관한 입니다.이것은 일반적으로 ctype 또는 기타 특수 리소스를 해제하는 것에 관한 것입니다.
그리고 그것을 좋아하지 않는 나의 개인적인 이유.__del__
기능.
- 를 꺼낼
__del__
그것은 혼란의 30가지 메시지로 진화합니다. - Python의 Zen에서 다음 항목이 깨집니다.
- 단순한 것이 복잡한 것보다 낫습니다.
- 특별한 경우는 규칙을 어길 만큼 특별하지 않습니다.
- 오류는 절대 조용히 전달되어서는 안 됩니다.
- 애매모호한 상황에서, 추측하고 싶은 유혹을 거절하세요.
- 이를 위한 분명한 방법은 하나, 가급적이면 하나뿐이어야 합니다.
- 구현이 설명하기 어렵다면, 그것은 나쁜 생각입니다.
그래서, 사용하지 말아야 할 이유를 찾으세요.__del__
.
그__del__
메서드, 개체가 가비지 수집될 때 호출됩니다.그러나 반드시 호출이 보장되는 것은 아닙니다.다음 코드만으로는 이 작업을 수행할 수 없습니다.
del obj
는 그이는입니다.del
참조 카운트를 1씩만 줄입니다. 어떤 그 , 만다무그물대한가있언면다지고급을체에가약른언가▁if,.__del__
전화를 받지 않습니다.
사용 시 주의해야 할 몇 가지 사항이 있습니다.__del__
그래도.일반적으로, 그것들은 보통 매우 유용하지 않습니다.제가 보기에는 당신이 밀접한 방법을 쓰길 원하는 것처럼 들리네요. 아니면 진술서가 있을 수도 있어요.
메서드에 대한 python 설명서를 참조하십시오.
더 은 다음과 같습니다.__del__
메서드는 과도하게 사용될 경우 가비지 수집을 금지할 수 있습니다.특히, 두 개 이상의 객체가 있는 순환 참조는 다음과 같습니다.__del__
메서드가 가비지를 수집하지 않습니다.쓰레기 수거원은 어떤 것을 먼저 불러야 할지 모르기 때문입니다.자세한 내용은 gc 모듈의 설명서를 참조하십시오.
그__del__
메소드(메소드 철자)는 개체가 최종적으로 삭제될 때 호출됩니다.엄밀히 말하면 객체에 대한 참조가 더 이상 없을 때, 즉 범위를 벗어나는 경우(cPython)입니다.
개체를 삭제하고 다음을 호출하려면__del__
use use 용방용
del obj1
개체를 삭제합니다(다른 참조가 없는 경우).
나는 당신이 이렇게 작은 수업을 쓰는 것을 제안합니다.
class T:
def __del__(self):
print "deleted"
그리고 파이썬 인터프리터에서 조사합니다.
>>> a = T()
>>> del a
deleted
>>> a = T()
>>> b = a
>>> del b
>>> del a
deleted
>>> def fn():
... a = T()
... print "exiting fn"
...
>>> fn()
exiting fn
deleted
>>>
과 ironpython과 ironpython의 .__del__
이 호출됩니다.사용하는 것은 좋은 방법으로 간주되지 않습니다.__del__
하지만 이것과 그것이 호출될 때 물체와 그 환경이 알 수 없는 상태에 있을 수 있다는 사실 때문입니다.은 아닙니다.__del__
를 호출합니다. 인터프리터는 모든 개체를 삭제하지 않고 다양한 방법으로 종료할 수 있습니다.
처럼, 서언급이듯했앞,이듯,__del__
기능이 다소 신뢰할 수 없습니다.유용해 보일 수 있는 경우, 다음을 사용하는 것을 고려합니다.__enter__
그리고.__exit__
대신 방법을 사용합니다.이는 다음과 유사한 동작을 제공합니다.with open() as f: pass
파일 액세스에 사용되는 구문입니다. __enter__
는 의 으로 호출됩니다.with
,하는 동안에__exit__
종료 시 자동으로 호출됩니다.자세한 내용은 이 질문을 참조하십시오.
언급URL : https://stackoverflow.com/questions/1481488/what-is-the-del-method-and-how-do-i-call-it
'programing' 카테고리의 다른 글
스프링 보안, 상태 비저장 REST 서비스 및 CSRF (0) | 2023.06.21 |
---|---|
함수의 출력 억제 (0) | 2023.06.21 |
Git에 의해 마스터에서 커밋되지 않은 변경 사항을 새 분기에 넣는 중 (0) | 2023.06.21 |
MySQL INSERT IGNORE에 해당하는 Oracle? (0) | 2023.06.21 |
superclass __init_ 메서드가 자동으로 호출되지 않는 이유는 무엇입니까? (0) | 2023.06.21 |