Python 類中的變量(或屬性)分類以及特點詳解 [OOP][類變量][實例變量][局部變量][類屬性][實例屬性][不同變量各自的特點]

您的“關注”和“點贊”,是信任,是認可,是支持,是動力…

如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。

1 類中的變量分類介紹

類體中的屬性,指的就是類中的變量。

在類體中,根據變量定義的位置不同,以及定義的方式不同,類中的屬性可細分爲以下三種類型,如下所示:

  • 類體中,所有函數之外:此範圍定義的變量,稱爲類屬性或類變量
  • 類體中,所以函數內部:以“self.變量名”的方式定義的變量,稱爲實例屬性或實例變量
  • 類體中,所有函數內部:以“變量名 = 變量值”的方式定義的變量,稱爲局部變量

2 類變量(類屬性)

2.1 類變量(類屬性)概述

類變量指的是類體中、所有函數之外定義的變量。

舉例如下所示:

class User:
    # 定義類變量
    name = '碼農阿杰'  # 類變量 name
    age = 28  # 類變量 age

    # 實例方法
    def add_id(self, user_id):
        print('添加用戶id的實例方法')

2.2 類變量(類屬性)的特點

類變量會被所有類的實例化對象都同時共享。

類變量的調用方式有兩種,如下所示,

(1)使用類的實例化對象調用類變量。

  • 通過類對象可以調用所屬類中的類變量。此方式不建議使用,因爲如果實例變量和類變量同名時,使用類對象將無法調用類變量,它會首選實例變量(實例變量在第 3 小節會介紹。舉例也在第 3 小節)。
  • 注意:通過類對象是無法修改類變量的。通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量。

(2)使用類名直接調用類變量。

  • 通過類名不僅可以調用所屬類中的類變量,而且可以修改它的值。
  • 通過類名訪問類變量之外,還可以動態的爲類和對象添加類變量。
  • 注意:因爲類變量會被所有類的實例化對象都同時共享,所以,通過類名修改類變量的值,會影響所有的實例化對象。

舉例如下所示:
例一,(1)使用類的實例化對象調用。

class User:
    # 定義類變量
    name = '碼農阿杰'
    age = 28

    # 實例方法
    def add_id(self, user_id):
        print('添加用戶id的實例方法')


# (1)使用類的實例化對象調用類變量。
user = User()  # 類的實例化(創建 User 類的對象)

print('修改前 類變量 name =', user.name)
print('修改前 類變量 age =', user.age)

print('------------------------------')

# 修改類變量的值
user.name = '阿杰'
user.age = 18

print('修改後 類變量 name =', User.name)
print('修改後 類變量 age =', User.age)

print('------------------------------')
# 通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量
print('通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量')
print('修改後 類變量 name =', user.name)
print('修改後 類變量 age =', user.age)

運行結果:

修改前 類變量 name = 碼農阿杰
修改前 類變量 age = 28
------------------------------
修改後 類變量 name = 碼農阿杰
修改後 類變量 age = 28
------------------------------
通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量
修改後 類變量 name = 阿杰
修改後 類變量 age = 18

例二,(2)使用類名直接調用。

class User:
    # 定義類變量
    name = '碼農阿杰'
    age = 28

    # 實例方法
    def add_id(self, user_id):
        print('添加用戶id的實例方法')


# (2)使用類名直接調用。
print('修改前 類變量 name =', User.name)
print('修改前 類變量 age =', User.age)

print('------------------------------')

# 修改類變量的值
User.name = '阿杰'
User.age = 18

print('修改後 類變量 name =', User.name)
print('修改後 類變量 age =', User.age)

print('------------------------------')

# 動態的爲類和對象添加類變量 gender
User.gender = '男'

print('動態的爲類和對象添加類變量 gender =', User().gender)

運行結果:

修改前 類變量 name = 碼農阿杰
修改前 類變量 age = 28
------------------------------
修改後 類變量 name = 阿杰
修改後 類變量 age = 18
------------------------------
動態的爲類和對象添加類變量 gender =

3 實例變量(實例屬性)

3.1 實例變量(實例屬性)概述

在任意類方法(構造方法或實例方法)內部以“self.變量名”的方式定義的變量,叫做實例變量(或實例屬性)。

舉例如下所示:

class User:
    # 構造方法
    def __init__(self):
        self.name = '碼農阿杰'  # 實例變量 name
        self.age = 28  # 實例變量 age

    # 實例方法
    def add_id(self):
       self.user_id = 1  # 實例變量 user_id

3.2 實例變量(實例屬性)的特點

  • 實例變量只作用於調用方法的對象。
  • 實例變量只能通過對象名訪問,無法通過類名訪問。
  • 如果實例變量和類變量同名,使用類對象將無法調用類變量,它會首選實例變量,這也是不推薦“類變量使用對象名調用”的原因。
  • 注意:和類變量不同的是,通過某個對象修改實例變量的值,不會影響類的其它實例化對象,更不會影響同名的類變量。

舉例如下所示:
例一,實例變量只作用於調用方法的對象。

class User:
    # 構造方法
    def __init__(self):
        self.name = '碼農阿杰'
        self.age = 28

    # 實例方法
    def add_id(self):
       self.user_id = 1


user = User()  # 類的實例化(創建 User 類的對象)

# 由於 __init__(self) 構造方法是在創建類對象時自動調用,所以 User 類的類對象都會包含 name 和 age 實例變量
print(user.name)
print(user.age)
# 由於 user_id 實例變量在 add_id(self) 實例方法體中,如果 add_id(self) 實例方法沒有被調用,那麼 User 類的類對象中是不包含 user_id 實例變量的
print(user.user_id)

運行結果:

碼農阿杰
28
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 162, in <module>
    print(user.user_id)
AttributeError: 'User' object has no attribute 'user_id'

例二,實例變量只能通過對象名訪問,無法通過類名訪問。

class User:
    # 構造方法
    def __init__(self):
        self.name = '碼農阿杰'
        self.age = 28

    # 實例方法
    def add_id(self):
       self.user_id = 1


user = User()  # 類的實例化(創建 User 類的對象)
print('使用對象名訪問實例變量 name = ', user.name)  # 實例變量只能通過對象名訪問
print('使用類名訪問實例變量 name = ', User.name)  # 實例變量無法通過類名訪問。

運行結果:

使用對象名訪問實例變量 name =  碼農阿杰
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 158, in <module>
    print('使用類名訪問實例變量 name = ', User.name)
AttributeError: type object 'User' has no attribute 'name'

例三,

class User:
    # 定義類變量
    name = '阿杰'
    age = 18
    # 構造方法
    def __init__(self):
        self.name = '碼農阿杰'
        self.age = 28

    # 實例方法
    def add_id(self):
       self.user_id = 1


user = User()  # 類的實例化(創建 User 類的對象)

# 如果實例變量和類變量同名,使用類對象將無法調用類變量,它會首選實例變量,
# 這也是不推薦“類變量使用對象名調用”的原因。
print('如果類變量和實例變量同名,通過類對象訪問類變量 name = ', user.name)
print('如果類變量和實例變量同名,通過類對象訪問類變量 age = ', user.age)

運行結果:

如果類變量和實例變量同名,通過類對象訪問類變量 name =  碼農阿杰
如果類變量和實例變量同名,通過類對象訪問類變量 age =  28

4 局部變量

4.1 局部變量概述

類方法中直接以 “變量名 = 值” 的方式進行定義的變量,叫做局部變量。

舉例如下所示:

class User:
    # 實例方法
    def user_info(self):
        name = '碼農阿杰'  # 局部變量 name
        age = 28  # 局部變量 age
        print(name, age)
        

4.2 局部變量的特點

局部變量只能用於所在函數中,函數執行完成後,局部變量也會被銷燬。

舉例如下所示:

class User:
    # 實例方法
    def user_info(self):
        name = '碼農阿杰'  # 局部變量 name
        age = 28  # 局部變量 age
        print(name, age)


user = User()
user.user_info()  # 執行 user_info() 方法,輸出結果,該方法執行完畢

# 局部變量 name 和 age ,只能用於所在方法中,方法執行完畢後,局部變量也會被銷燬。
print(user.name)
print(user.age)

運行結果:

碼農阿杰 28
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 156, in <module>
    print(user.name)
AttributeError: 'User' object has no attribute 'name'

【友情鏈接】

微信公衆號:碼農阿杰

博客園

【參考資料】

Python 官網

Python 3.8.2 documentation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章