python - 请问这个语句中打印的变量是类变量还是实例变量?
PHPz
PHPz 2017-04-17 17:40:17
0
5
485
class my_class():
    args1=1
    def fun(self):
        print self.args1
        
my_c=my_class()
my_c.fun()

请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?

PHPz
PHPz

学习是最好的投资!

membalas semua(5)
刘奇

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

PHPzhong

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.

class MyClass:
    args1 = 1

    def fun(self):
        print id(self.args1)


my_c = MyClass()
print id(MyClass.args1)
my_c.fun()

Jika anda melihat lebih dalam, sebenarnya, diri di sini hanya mewakili objek terikat Anda juga boleh menamakannya dengan nama pembolehubah lain

class MyClass:
    args1 = 1

    def fun(binding):  #这里用的是binding,而不是self
        print id(binding.args1)


my_c = MyClass()
print id(MyClass.args1)
my_c.fun()
左手右手慢动作
class myclass():
    args = 1
    def fun(self):
        print self.args
        self.__class__.args += 1

if __name__ == '__main__':
    m1 = myclass()
    m1.fun()
    m2 = myclass()
    m2.fun()

Hasilnya ialah

 1
 2

Jelas sekali pembolehubah kelas

洪涛

self.args1Ini ialah pembolehubah tika.
my_class.args1Ini ialah pembolehubah kelas.

class my_class():
    args1=1
    def fun(self):
        print self.args1      #这是实例变量
        print my_class.args1  #这是类变量
        
       
左手右手慢动作

self.args1 Ini ialah pembolehubah tika.
my_class.args1 Ini ialah pembolehubah kelas.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan