首先我們看一段代碼以及輸出:
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