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
もオブジェクトの一種です。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__()
CC
をインスタンス化すると、メモリ内に 2 つのオブジェクトが存在します (緑色の文字はオブジェクト内のプロパティとメソッドです)。1 つはCC
です。 >、もう 1 つはdd
です、🎜 🎜dd.setXY(4,5)
を実行すると、setXY
> が実行するため、self
はdd
に設定されます。dd
には存在しないため、インタープリタは親クラスを検索し、CC
でsetXY
を見つけて実行します (self) code>、つまり、
はまだ存在しており、dd
内にさらに 2 つのメンバーx
とy
があります。🎜 🎜インタプリタは、dd
の親クラスがCC
であることをどのようにして知るのでしょうか?答えは、
dd.__class__
です🎜 🎜CC
を削除すると、実際には変数CC
が削除されるだけで、クラスCC
が占有するメモリは削除されません。 >dddd
は属性__class__
を通じてクラスCC
を参照しています (python
Memory)管理は参照カウントに基づいています)🎜 🎜つまり、変数CC
ではクラスを見つけることができませんが、dd.__class__
を通してクラスを見つけることができるというだけです。 🎜 したがって、次のように書くことができます、ee = dd.__class__()
🎜