programing

__del__ 메서드는 무엇이며 어떻게 부르나요?

bestprogram 2023. 6. 21. 22:49

__del__ 메서드는 무엇이며 어떻게 부르나요?

메서드가 정의된 클래스를 보았습니다.이 메서드는 클래스의 인스턴스를 삭제하는 데 사용됩니다.하지만 저는 이 방법을 사용하는 곳을 찾을 수 없습니다.이 방법은 어떻게 사용됩니까?그런 식으로:obj1.del()?.

어떻게 부를까요?__del__방법?

__del__최종 결정자입니다.개체에 대한 모든 참조가 삭제된 후 특정 시점에 발생하는 개체 가비지 수집 시 호출됩니다.

단순한 경우에 이것은 당신이 말한 직후일 수 있습니다.del x또는, 만약x함수가 종료된 후 로컬 변수입니다.특히 순환 참조가 없는 한 CPython(표준 Python 구현)은 즉시 *가비지 수집을 수행합니다.

그러나 이것은 CPython의 구현 세부사항입니다.Python 가비지 컬렉션에 필요한 유일한 속성은 모든 참조가 삭제된 후에 발생한다는 것입니다. 따라서 이러한 속성은 직후에 발생할 필요가 없고 전혀 발생하지 않을 도 있습니다.

더욱이, 변수는 여러 가지 이유로 인해 오랫동안 존재할 수 있습니다. 예를 들어, 전파 예외 또는 모듈 검사는 변수 참조 카운트를 0보다 크게 유지할 수 있습니다.또한 변수는 참조 주기의 일부가 될 수 있습니다. 가비지 수집 기능이 설정된 Cython은 이러한 주기를 모두가 아닌 대부분의 중단 시간과 주기적인 중단 시간을 가집니다.

실행된다는 보장이 없기 때문에 실행해야 하는 코드를 입력해서는 안 됩니다.__del__()이 는 대신, ▁the에 .finally의 절try 또는 설명with진술.그러나 다음에 대한 유효한 사용 사례가 있습니다.__del__예를 들어, 대상인 경우XY그리고 또한 복사본을 보관합니다.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