Python的類變量和實例變量

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

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é)會說是變量的作用域問題,事實上是實例變量和類變量的區(qū)別問題。

我們接著看看對象student的變量有哪些:

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

為空!

為什么為空呢?(暫時思考下)
我們再看看類Student的變量:

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': '張三'})

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

之所以為空,是因為我們實例化對象的時候為指明實例變量的保存?,F(xiàn)在修改一下實例化函數(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只和實例化的對象有關(guān)和類無關(guān),代表實例。

如何在實例方法中調(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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