class CC:
def setXY(self,x,y):
self.x=x
self.y=y
def printXY(self):
print(self.x,self.y)
dd=CC()
print(dd.__dict__) # {} #对象CC()的所有成员
print(CC.__dict__) #{'__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None, '__dict__': <attribute '__dict__' of 'CC' objects>, 'printXY': <function CC.printXY at 0x0000000000A50268>, '__module__': '__main__', 'setXY': <function CC.setXY at 0 #输出类CC的所有成员
dd.setXY(4,5)
print(dd.__dict__) #{'y': 5, 'x': 4}#赋值后类对象有值了
print(CC.__dict__) #{'printXY': <function CC.printXY at 0x0000000001160268>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None, 'setXY': <function CC.setXY at 0x00000000011601E0>}#赋值后没变
del CC
#ee=CC() NameError: name 'CC' is not defined
dd.printXY() # 4 5
第一点是那个self的作用,第二点是为赋值后撒类对象变化了而类却没变
python
의 모든 것은 객체이고,class
도 일종의 객체입니다.위 그림과 같이
CC
을 인스턴스화하면 메모리에 두 개의 개체가 있게 됩니다(녹색 단어는 개체 내부의 속성과 메서드입니다). 하나는CC
이고 다른 하나는 ,dd
을 실행하면
안에 두 명의 멤버가 더 있습니다.dd.setXY(4,5)
이self
로 설정됩니다.dd
에는setXY
이 없기 때문에 통역사는dd
에서 상위 클래스를 조회하고CC
에서setXY
을 찾아self
을 실행합니다. 즉,dd
,x
및y
,통역사는
dd
의 상위 클래스가CC
인지 어떻게 알 수 있나요?답은
dd.__class__
CC
을 삭제하면 실제로CC
변수만 삭제되지만CC
클래스가 차지하는 메모리는 삭제하지 않습니다.dd
도 여전히 존재하고dd
클래스도 여전히 존재하기 때문입니다.__class__
은CC
속성을 통해 참조됩니다. (python
메모리 관리는 참조 카운팅을 기반으로 합니다.)그래서
를 통해서는 찾을 수 있다는 것입니다.CC
변수로는 클래스를 찾을 수 없고dd.__class__
,그러니까 이렇게 쓰시면 됩니다
ee = dd.__class__()