python - 类 类对象 赋值后的分别变化,及删除后为什么还有值
伊谢尔伦
伊谢尔伦 2017-04-18 10:23:36
0
1
564
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的作用,第二点是为赋值后撒类对象变化了而类却没变

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(1)
小葫芦

python 内のすべてのものはオブジェクトであり、class もオブジェクトの一種です。 python中一切皆对象,class也是对象的一种,

如上图,当你实例化CC以后,内存中就有了两个对象(绿色字是对象内部的属性和方法),一个是CC,一个是dd

当你执行dd.setXY(4,5)时,self就被设置为dd,因为setXY不存在于dd中,所以解释器沿着父类往上找,在CC中找到了setXY并执行,self,即dd内部就多了两个成员xy

解释器是怎么知道dd的父类是CC呢?
答案是,dd.__class__

当你删除了CC以后,其实你只是删除了CC这个变量而已,,并没有删除类CC所占有的内存,因为dd还依旧存在的,dd还通过属性__class__引用着类CCpython内存管理是基于引用计数的)

因此只是无法通过变量CC找到类而已,但是你可以通过dd.__class__找到,

因此,你可以这样写,ee = dd.__class__()

上の図に示すように、CC をインスタンス化すると、メモリ内に 2 つのオブジェクトが存在します (緑色の文字はオブジェクト内のプロパティとメソッドです)。1 つは CC です。 >、もう 1 つは dd です、🎜 🎜 dd.setXY(4,5) を実行すると、setXY > が実行するため、selfdd に設定されます。 dd には存在しないため、インタープリタは親クラスを検索し、CCsetXY を見つけて実行します (self) code>、つまり、dd 内にさらに 2 つのメンバー xy があります。🎜 🎜インタプリタは、dd の親クラスが CC であることをどのようにして知るのでしょうか?
答えは、dd.__class__ です🎜 🎜 CC を削除すると、実際には変数 CC が削除されるだけで、クラス CC が占有するメモリは削除されません。 >dd
はまだ存在しており、dd は属性 __class__ を通じてクラス CC を参照しています (pythonMemory)管理は参照カウントに基づいています)🎜 🎜つまり、変数 CC ではクラスを見つけることができませんが、dd.__class__ を通してクラスを見つけることができるというだけです。 🎜 したがって、次のように書くことができます、ee = dd.__class__()🎜
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート