#3 Python面向對象(二)

前言

上一節主要記錄面向對象編程的思想以及Python類的簡單創建,這節繼續深入類中變量的相關知識,Here we go!

Python中類的各種變量

1.1 類變量

類變量定義:在類中,在函數體(方法)外的變量稱為類變量。類變量在整個類中是公用的

類變量初始化:按照以上定義,類變量的初始化如下

1 class Doctor:
2     '''
3     類變量的初始化
4     '''
5     salary = 100  # salary為類變量
6 
7     def talk():
8         print('I am a doctor')

類變量訪問:因為類變量在整個類中是公用的,所以在不同的環境下都能訪問。在類中函數體外直接使用 類變量 訪問;在類中函數體內使用 類.類變量 或者 實例.類變量 訪問;在類外使用 類.類變量 或者 實例.類變量訪問

class Doctor:
    '''
    在類中函數體外訪問類變量salary
    '''
    salary = 100
    print(salary)

    def talk(self):
        print('I am a doctor')


lisi = Doctor()   # 一旦實例化后,就會自動按順序執行類中函數體外的代碼


# 運行結果:
100
class Doctor:
    '''
    在類中函數體內訪問類變量salary
    '''
    salary = 100

    def talk0(self):
        '''
        使用類.類變量訪問
        '''
        print('My salary is {0}'.format(Doctor.salary))

    def talk1(self):
        '''
        使用實例.類變量訪問
        '''
        print('My salary is {0}'.format(self.salary))


lisi = Doctor()

lisi.talk0()
lisi.talk1()


# 運行結果:
My salary is 100
My salary is 100
class Doctor:
    '''
    在類外訪問類變量salary
    '''
    salary = 100

    def talk(self):
        print('I am a doctor')


lisi = Doctor()
print(Doctor.salary)  # 使用 類.類變量 訪問
print(lisi.salary)   # 使用 實例.類變量 訪問


# 運行結果:
100
100

1.2 實例變量

實例變量定義:在類中,在函數體(方法)內的變量稱為實例變量。

實例變量初始化:按照上面定義,實例變量的初始化如下

1 class Doctor:
2     '''
3     初始化實例變量
4     '''
5 
6     def talk(self):
7         self.sentence = 'I am man'    # self.sentence 為實例變量

實例變量訪問:實例變量在整個類中並不是公用的,所以其訪問範圍有限。在類中函數體內使用 實例.實例變量 訪問;在類外使用 實例.實例變量 訪問

class Doctor:
    '''
    類中函數體內的訪問
    '''

    def talk(self):
        self.sentence = 'I am man'    # 初始化實例變量self.sentence
        print(self.sentence)   # 訪問實例變量


lisi = Doctor()

lisi.talk()  # 調用talk方法


# 運行結果:
I am man
class Doctor:
    '''
    類外訪問實例變量
    '''

    def talk(self):
        self.sentence = 'I am man'    # 初始化實例變量self.sentence


lisi = Doctor()

lisi.talk()  # 必須先執行talk方法才能訪問talk方法裏面的實例變量
print(lisi.sentence)  # 類外訪問實例變量

1.3 類變量、實例變量與全局變量、局部變量的異同點

在Python基礎教程中講解了全局變量與局部變量的相關知識,本節提到的兩個變量與它們有什麼異同呢?

  • 絕對來說,類變量與實例變量都是局部變量

  • 相對來說,在類中,類變量相當於全局變量,但實例變量並不相當於局部變量,更不相當於全局變量

  • 相對來說,在實例中,類變量和實例變量都相當於全局變量

  • 相對來說,在類中的方法里,才有局部變量,初始化的時候不是定義 實例.實例變量 ,而是直接定義 變量 

 一下子說的這麼複雜難以理解,舉個栗子🌰就明白了:

class Doctor:
    salary = 100

    def talk(self):
    ¦   print('I am a doctor')


print(salary)

# salary是Doctor的類變量,在類中定義
# 但在主程序中並不能被正確訪問
# 因為salary變量是局部變量


# 運行結果:
Traceback (most recent call last):
  File "8.py", line 8, in <module>
    print(salary)
NameError: name 'salary' is not defined

# 拋出變量未定義異常
class Doctor:
    def talk(self):
        self.salary = 100


print(salary)

# 同樣,實例變量self.salary也是局部變量


# 運行結果:
Traceback (most recent call last):
  File "9.py", line 6, in <module>
    print(salary)
NameError: name 'salary' is not defined

# 拋出變量未定義異常
class Doctor:
    def talk(self):
        self.salary = 100


Doctor().talk()
print(salary)

# 即使執行了talk方法,也不能正確訪問
# 因為它至始至終都是局部變量

# 運行結果:
Traceback (most recent call last):
  File "9.py", line 12, in <module>
    print(salary)
NameError: name 'salary' is not defined
class Doctor:
    salary = 100
    print(salary)

    def talk(self):
        print(Doctor.salary)

    def eat(self):
        print(Doctor.salary)


lisi = Doctor()
lisi.talk()
lisi.eat()

# 因為類變量在整個類中都是共有的
# 因此類變量能被類中的方法訪問
# 換句話說,在類中類變量相當於全局變量

# 運行結果:

  100
  100
  100

class Doctor:
    salary = 100
    print(salary)

    def talk(self):
        self.food = 'BaoZi'
        print(Doctor.salary)
        print(self.food)

    def eat(self):
        print(Doctor.salary)
        print(self.food)


lisi = Doctor()
lisi.talk()
lisi.eat()

# 在talk方法裏面定義實例變量self.food
# 但是在eat方法裏面卻可以訪問self.food這個實例變量
#(前提是必須先運行talk方法,就相當於初始化self.food)
# 因此,在實例中,類變量和實例變量都相當於全局變量


# 運行結果:

  100
  100
  BaoZi
  100
  BaoZi

 

class Doctor:

    def talk(self):
        salary = 100
        print(salary)

    def eat(self):
        print(salary)


lisi = Doctor()
lisi.talk()
lisi.eat()

# 在類中talk方法里定義局部變量salary
# 在其他方法中是不能被訪問的


# 運行結果:
100
Traceback (most recent call last):
  File "12.py", line 13, in <module>
    lisi.eat()
  File "12.py", line 8, in eat
    print(salary)
NameError: name 'salary' is not defined

1.4 類變量和實例變量注意事項

「類變量在類中函數體內有兩種訪問方式: 類.類變量 和 實例.類變量 ,這兩種方式會帶來不同的後果。使用 實例.類變量 訪問類變量后,其實是重新創建了一個新的實例變量: 實例.實例變量 ,與類變量已經無關了」

class Doctor:
    salary = 100  # 初始化類變量salary

    def talk0(self):
        print('talk0:', Doctor.salary)
        Doctor.salary = 200   # 修改類變量salary的值為200

    def talk1(self):
        print('talk1:', Doctor.salary)
        print('talk1:', self.salary)
        self.salary = 300   # 修改self.salary的值為300

    def talk2(self):
        print('talk2:', self.salary)
        print('talk2:', Doctor.salary)  # 輸出的類變量並沒有被改變為300


lisi = Doctor()

lisi.talk0()
lisi.talk1()
lisi.talk2()


# 運行結果:
talk0: 100
talk1: 200
talk1: 200
talk2: 300
talk2: 200

強烈建議:類變量的訪問方法用 類.類變量 

小結

本小節介紹了Python中類的各種變量知識,在實際使用中要有深刻的理解才行。之後會記錄類的傳參、類的性質、類的屬性方法等,拜拜~~

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *