코드 A:
으아악코드 실행 결과:
코드 B:
으아악코드 B 실행 결과:
코드 C:
으아악코드 C 실행 결과:
내 질문 1:
이 세 가지 코드 A, B, C는 왜 서로 다른 결과를 출력합니까? 원리는 무엇입니까? 특히 코드 B와 코드 C는 왜 코드 C가 B를 기반으로 리턴을 추가하고 결과는 B보다 하나 더 많은 init 메소드입니까?
내 질문 2:
메서드에 매개변수를 전달할 때 self와 cls 두 매개변수의 차이점은 무엇인가요? __new__ 메소드에 cls가 매개변수로 필요하고 __init__ 메소드에 self가 필요한 이유는 무엇입니까?
먼저 한 가지를 이해해야 합니다.
self
和cls
的区别,cls
是代表这个类
,slef
是用来代表这个类的实例
이것을 이해하면 성공할 수 있습니다.함수 매개변수
self
는 인스턴스 메서드이고 인스턴스에 바인딩된 이 함수로 이해될 수 있습니다.__new__
方法, 是新式类用来创建实例使用的, 传入的cls
就是用来给object.__new__
创建实例使用的参数, 如果没有传入cls
,object
어떤 종류의 인스턴스를 생성해야 할지 전혀 모르겠습니다.위 내용과 결합하여 출력이 다른 세 가지 이유에 대해 이야기해 보겠습니다.
왜 --new만 사용하나요? 왜냐하면 모든 클래스는 객체를 인스턴스화할 때 이것을 호출해야 하기 때문입니다
__new__
方法, 去创建实例, 所以它肯定会被调用, 但是因为该函数被你重写了, 所以它只是打印了--new方法
, 并没有返回创建实例, 并且放回, 所以__del__
그것도 일어나지 않을 것입니다1번에서 언급한 것처럼 --new와 --del만 있는 이유는 바로 여기에 있습니다
__new___
有创建新实例, 但是并没有返回, 因为只有返回了, 该对象才能进行下一步的__init__
정확히는 생성만 있고 반환은 없기 때문에 결과는 이렇습니다처음 두 가지 점을 이해하셨다면 생성되어 반환되므로 '__init__'도 실행되고 모든 것이 정상적인 동작으로 발생하므로 문제가 없을 것이라고 생각합니다
마지막으로 설명드리고 싶은 점은: 왜
__del__
会被执行, 理论上, 这个只有在实例被del
析构时, 才会执行,这里并没有del xtq
类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时,python
자발적인 메모리 재활용으로 모든 것이 먼지로 돌아가고 생성된 객체도 하나씩 파괴되는가