Jika anda memahami ruang kelas dan ruang contoh, masalah ini akan menjadi sangat mudah. Kelas mempunyai ruang nama mereka sendiri, dan kandungannya boleh dilihat melalui className.__dict__. Jika anda membuat instan dengan cara yang sama, maka tika ini juga akan mempunyai ruang namanya sendiri, yang digunakan untuk menyimpan ahli, kaedah, dll. Sudah tentu, contoh pasti boleh berkongsi ahli kelas. Khusus untuk kes anda, jika print self.args1, ia akan terlebih dahulu mencari dalam ruang nama contoh, dan ahli args1 tidak ditemui, jadi ia akan terus mencari ruang kelas dan mencari args1, jadi ia akan Keluarkan args1 kelas Tetapi jika terdapat pernyataan tugasan, seperti self.args1 = 1, maka contoh itu akan mencipta ahli args1 dalam ruangnya sendiri. Lihat kod di bawah:
In [14]: class A(object):
....: args1 = 1
....: def fun(self):
....: print self.args1
....: def fun2(self):
....: self.args1 = 2
In [15]: a = A()
In [16]: A.__dict__ # 这是类的名字空间,可以看到args1在里面
Out[16]: #删除了一些
{ 'args1': 1,
'fun': <function __main__.fun>,
'fun2': <function __main__.fun2>}
In [17]: a.__dict__ #而实例a的名字空间则没有args1
Out[17]: {}
In [18]: a.fun() #执行func 则是查找到了类的args1的成员。
1
In [19]: a.fun2() #执行了func2, 这就会在a这个实例空间里面创建args1这个成员,与类的无关。
In [20]: a.__dict__ #可以看到a的空间里面已经 有了args1.
Out[20]: {'args1': 2}
In [21]: a.fun() #再次执行,则会直接输出实例a自己的args1.
2
In [22]: A.args1 #类与实例的空间互不影响。
Out[22]: 1
In [23]: b = A() #实例之间的空间也是相互独立,
In [24]: b.args1
Out[24]: 1
Digabungkan dengan kod di atas, kita sepatutnya dapat memahaminya dari intipati relatif
Pembolehubah kelas, ini boleh disahkan dengan mencetak terus id objek kelas dan sama ada id objek yang dihadkan oleh diri adalah sama Alamat kelas dan id objek adalah sama digunakan adalah kerana Python mencari pembolehubah contoh terlebih dahulu secara lalai, dan kemudian mencari pembolehubah kelas jika ia tidak ditemui, jadi ia kelihatan sebagai pembolehubah objek, tetapi ia sebenarnya merujuk kepada pembolehubah kelas.
Jika anda memahami ruang kelas dan ruang contoh, masalah ini akan menjadi sangat mudah. Kelas mempunyai ruang nama mereka sendiri, dan kandungannya boleh dilihat melalui
className.__dict__
. Jika anda membuat instan dengan cara yang sama, maka tika ini juga akan mempunyai ruang namanya sendiri, yang digunakan untuk menyimpan ahli, kaedah, dll. Sudah tentu, contoh pasti boleh berkongsi ahli kelas.Khusus untuk kes anda, jika
print self.args1
, ia akan terlebih dahulu mencari dalam ruang nama contoh, dan ahliargs1
tidak ditemui, jadi ia akan terus mencari ruang kelas dan mencari args1, jadi ia akan Keluarkan args1 kelas Tetapi jika terdapat pernyataan tugasan, sepertiself.args1 = 1
, maka contoh itu akan mencipta ahli args1 dalam ruangnya sendiri. Lihat kod di bawah:Digabungkan dengan kod di atas, kita sepatutnya dapat memahaminya dari intipati relatif
Pembolehubah kelas, ini boleh disahkan dengan mencetak terus id objek kelas dan sama ada id objek yang dihadkan oleh diri adalah sama Alamat kelas dan id objek adalah sama digunakan adalah kerana Python mencari pembolehubah contoh terlebih dahulu secara lalai, dan kemudian mencari pembolehubah kelas jika ia tidak ditemui, jadi ia kelihatan sebagai pembolehubah objek, tetapi ia sebenarnya merujuk kepada pembolehubah kelas.
Jika anda melihat lebih dalam, sebenarnya, diri di sini hanya mewakili objek terikat Anda juga boleh menamakannya dengan nama pembolehubah lain
Hasilnya ialah
Jelas sekali pembolehubah kelas
self.args1
Ini ialah pembolehubah tika.my_class.args1
Ini ialah pembolehubah kelas.self.args1 Ini ialah pembolehubah tika.
my_class.args1 Ini ialah pembolehubah kelas.