Python的類變量和實(shí)例變量

首先我們看一段代碼以及輸出:

In [2]: class Student():
   ...:     name = "張三"
   ...:     age = 0
   ...:     def __init__(self, name, age):
   ...:         name = name 
   ...:         age = age
   ...:         

In [3]: student = Student("李四", 19)

In [4]: student.name
Out[4]: '張三'

In [5]: Student.name
Out[5]: '張三'

看到這里可能有的同學(xué)會(huì)說是變量的作用域問題,事實(shí)上是實(shí)例變量和類變量的區(qū)別問題。

我們接著看看對(duì)象student的變量有哪些:

In [6]: student.__dict__
Out[6]: {}

為空!

為什么為空呢?(暫時(shí)思考下)
我們?cè)倏纯搭怱tudent的變量:

In [7]: Student.__dict__
Out[7]: 
mappingproxy({'__dict__': <attribute '__dict__' of 'Student' objects>,
              '__doc__': None,
              '__init__': <function __main__.Student.__init__>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Student' objects>,
              'age': 0,
              'name': '張三'})

這里我們要說一下實(shí)例變量的查找機(jī)制:
當(dāng)在實(shí)例變量中查找不到某一變量時(shí)候,就會(huì)去類變量里查找,當(dāng)再查找不到的時(shí)候就會(huì)在父類中查找,因此輸出的name為張三。

之所以為空,是因?yàn)槲覀儗?shí)例化對(duì)象的時(shí)候?yàn)橹该鲗?shí)例變量的保存?,F(xiàn)在修改一下實(shí)例化函數(shù)。

In [10]: class Student():
    ...:     name = "張三"
    ...:     age = 0
    ...:     def __init__(self, name, age):
    ...:         self.name = name 
    ...:         self.age = age
    ...:         
    ...:         
    ...:         

In [11]: student = Student("李四", 19)

In [12]: student.name
Out[12]: '李四'

In [13]: Student.name
Out[13]: '張三'

我們傳入的self只和實(shí)例化的對(duì)象有關(guān)和類無關(guān),代表實(shí)例。

如何在實(shí)例方法中調(diào)用類變量呢?

In [14]: class Student():
    ...:     name = "張三"
    ...:     age = 0
    ...:     sums = 123
    ...:     def __init__(self, name, age):
    ...:         self.name = name 
    ...:         self.age = age
    ...:         print(Student.sums)
    ...:         print(self.__class__.sums)
    ...:         
    ...:         
    ...:         
    ...:         

In [15]: student = Student('李四', 19)
123
123
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,011評(píng)論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評(píng)論 19 139
  • 面向?qū)ο笾饕槍?duì)面向過程。 面向過程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,220評(píng)論 0 4
  • 最近熱映的《銀河護(hù)衛(wèi)隊(duì)》中加入的螳螂妹的角色是否給你帶來了很多笑點(diǎn)?對(duì)于星爵來說是非常隱私的事情居然被螳螂妹當(dāng)眾說...
    斯坦威閱讀 699評(píng)論 0 0

友情鏈接更多精彩內(nèi)容