在Python中訪問(wèn)類變量和實(shí)例變量的方法
在 Python 中訪問(wèn)類變量和實(shí)例變量的核心規(guī)則是:類變量可通過(guò)「類名」或「實(shí)例名」訪問(wèn)(類名訪問(wèn)更精準(zhǔn)),實(shí)例變量?jī)H能通過(guò)「實(shí)例名」訪問(wèn)。下面分「訪問(wèn)場(chǎng)景」「具體語(yǔ)法」「易錯(cuò)點(diǎn)」三個(gè)維度講透,結(jié)合例子讓你快速掌握。
一、訪問(wèn)類變量的兩種方式
類變量屬于類本身,因此有兩種合法訪問(wèn)方式,核心區(qū)別是「是否依賴實(shí)例」。
| 訪問(wèn)方式 | 語(yǔ)法 | 適用場(chǎng)景 | 優(yōu)點(diǎn) |
|---|---|---|---|
| 通過(guò)類名訪問(wèn) | 類名.類變量名 | 任何場(chǎng)景(推薦優(yōu)先使用) | 直接訪問(wèn)類變量本身,無(wú)歧義 |
| 通過(guò)實(shí)例名訪問(wèn) | 實(shí)例名.類變量名 | 已有實(shí)例,且無(wú)需修改類變量時(shí) | 便捷,與實(shí)例變量訪問(wèn)語(yǔ)法統(tǒng)一 |
代碼示例:訪問(wèn)類變量
class Student:
# 定義類變量
school = "北京大學(xué)"
count = 0
def __init__(self, name):
# 定義實(shí)例變量
self.name = name
Student.count += 1 # 類內(nèi)部通過(guò)類名訪問(wèn)類變量(推薦)
# 1. 類外部通過(guò)類名訪問(wèn)(最推薦,無(wú)實(shí)例也能訪問(wèn))
print(Student.school) # 輸出:北京大學(xué)
print(Student.count) # 輸出:0(還未創(chuàng)建實(shí)例)
# 2. 創(chuàng)建實(shí)例后,通過(guò)實(shí)例訪問(wèn)類變量
stu1 = Student("張三")
print(stu1.school) # 輸出:北京大學(xué)(實(shí)例共享類變量)
print(stu1.count) # 輸出:1(類變量已被__init__修改)
# 3. 類內(nèi)部的方法中訪問(wèn)類變量
class Student:
school = "北京大學(xué)"
# 實(shí)例方法中訪問(wèn)類變量
def print_school(self):
print("實(shí)例方法訪問(wèn):", Student.school) # 類名訪問(wèn)(推薦)
# 也可通過(guò)self訪問(wèn)(等價(jià)于self.__class__.school)
print("self訪問(wèn)類變量:", self.school)
# 類方法中訪問(wèn)類變量(推薦用cls)
@classmethod
def change_school(cls, new_school):
cls.school = new_school
print("類方法訪問(wèn):", cls.school) # cls等價(jià)于類名
# 靜態(tài)方法中訪問(wèn)類變量(只能用類名)
@staticmethod
def static_print():
print("靜態(tài)方法訪問(wèn):", Student.school)
stu = Student("李四")
stu.print_school() # 實(shí)例方法訪問(wèn)類變量
Student.change_school("清華大學(xué)") # 類方法訪問(wèn)/修改類變量
Student.static_print() # 靜態(tài)方法訪問(wèn)類變量二、訪問(wèn)實(shí)例變量的唯一方式
實(shí)例變量屬于單個(gè)實(shí)例,因此只能通過(guò)「實(shí)例名」訪問(wèn),類名無(wú)法直接訪問(wèn)(實(shí)例變量是實(shí)例的 “私有屬性”)。
| 訪問(wèn)場(chǎng)景 | 語(yǔ)法 | 注意事項(xiàng) |
|---|---|---|
| 類外部訪問(wèn) | 實(shí)例名.實(shí)例變量名 | 必須先創(chuàng)建實(shí)例,否則報(bào)錯(cuò) |
| 類內(nèi)部方法訪問(wèn) | self.實(shí)例變量名 | self 代表當(dāng)前實(shí)例,是訪問(wèn)實(shí)例變量的唯一入口 |
代碼示例:訪問(wèn)實(shí)例變量
class Student:
def __init__(self, name, score):
# 定義實(shí)例變量
self.name = name
self.score = score
# 類內(nèi)部訪問(wèn)實(shí)例變量(必須用self)
def print_info(self):
print(f"姓名:{self.name},分?jǐn)?shù):{self.score}")
# 1. 類外部訪問(wèn)實(shí)例變量(先創(chuàng)建實(shí)例)
stu1 = Student("張三", 90)
print(stu1.name) # 輸出:張三
print(stu1.score) # 輸出:90
# 2. 類內(nèi)部通過(guò)self訪問(wèn)實(shí)例變量
stu1.print_info() # 輸出:姓名:張三,分?jǐn)?shù):90
# 3. 錯(cuò)誤示例:類名無(wú)法訪問(wèn)實(shí)例變量
# print(Student.name) # 報(bào)錯(cuò):AttributeError: type object 'Student' has no attribute 'name'
# 4. 不同實(shí)例的實(shí)例變量獨(dú)立訪問(wèn)
stu2 = Student("李四", 85)
print(stu2.name) # 輸出:李四(與stu1的name互不干擾)三、關(guān)鍵易錯(cuò)點(diǎn)與避坑指南
1. 實(shí)例訪問(wèn)類變量時(shí),若實(shí)例有同名變量會(huì) “遮蔽” 類變量
實(shí)例訪問(wèn)實(shí)例名.變量名時(shí),Python 會(huì)優(yōu)先查找實(shí)例自身的變量,找不到才會(huì)找類變量。若實(shí)例有同名變量,會(huì)遮蔽類變量(看似 “訪問(wèn)類變量”,實(shí)際訪問(wèn)的是實(shí)例變量):
class Student:
school = "北京大學(xué)"
stu = Student()
stu.school = "復(fù)旦大學(xué)" # 給實(shí)例新增同名變量
print(stu.school) # 輸出:復(fù)旦大學(xué)(訪問(wèn)的是實(shí)例變量,而非類變量)
print(Student.school) # 輸出:北京大學(xué)(類變量未變)2. 類內(nèi)部訪問(wèn)類變量:優(yōu)先用類名 /cls,而非 self
在實(shí)例方法中用self.類變量名訪問(wèn)時(shí),若實(shí)例有同名變量,會(huì)誤訪問(wèn)實(shí)例變量。推薦用類名.類變量名(或self.__class__.類變量名):
class Student:
school = "北京大學(xué)"
def wrong_access(self):
self.school = "錯(cuò)誤值" # 實(shí)際是給實(shí)例新增變量
print(self.school) # 輸出:錯(cuò)誤值(誤訪問(wèn)實(shí)例變量)
def right_access(self):
print(Student.school) # 輸出:北京大學(xué)(精準(zhǔn)訪問(wèn)類變量)
stu = Student()
stu.wrong_access()
stu.right_access()3. 不能通過(guò)類名訪問(wèn)實(shí)例變量,哪怕實(shí)例已存在
實(shí)例變量是實(shí)例的屬性,類名無(wú)法感知具體實(shí)例,因此無(wú)論是否創(chuàng)建實(shí)例,類名都不能訪問(wèn)實(shí)例變量:
stu = Student("張三", 90)
# print(Student.name) # 始終報(bào)錯(cuò):類無(wú)此屬性四、訪問(wèn)規(guī)則總結(jié)表
| 變量類型 | 合法訪問(wèn)方式 | 非法訪問(wèn)方式 | 核心提醒 |
|---|---|---|---|
| 類變量 | 1. 類名。類變量名2. 實(shí)例名。類變量名 | 無(wú)(兩種方式都合法) | 實(shí)例訪問(wèn)時(shí)注意同名遮蔽問(wèn)題 |
| 實(shí)例變量 | 1. 實(shí)例名。實(shí)例變量名2. 類內(nèi) self. 實(shí)例變量名 | 類名。實(shí)例變量名 | 只能通過(guò)實(shí)例 /self 訪問(wèn),類名不行 |
最終總結(jié)
- 訪問(wèn)類變量:優(yōu)先用
類名.類變量名(精準(zhǔn)無(wú)歧義),實(shí)例僅在 “無(wú)同名變量” 時(shí)可臨時(shí)用實(shí)例名.類變量名; - 訪問(wèn)實(shí)例變量:唯一合法方式是
實(shí)例名.實(shí)例變量名(類外)或self.實(shí)例變量名(類內(nèi)),類名訪問(wèn)必報(bào)錯(cuò); - 核心原則:“誰(shuí)的屬性找誰(shuí)要”—— 類變量找類,實(shí)例變量找實(shí)例。
以上就是在Python中訪問(wèn)類變量和實(shí)例變量的方法的詳細(xì)內(nèi)容,更多關(guān)于Python訪問(wèn)類變量和實(shí)例變量的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Django migrate不能發(fā)現(xiàn)app.models的表問(wèn)題
今天小編就為大家分享一篇解決Django migrate不能發(fā)現(xiàn)app.models的表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
詳解利用python+opencv識(shí)別圖片中的圓形(霍夫變換)
這篇文章主要介紹了詳解利用python+opencv識(shí)別圖片中的圓形(霍夫變換),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python結(jié)合DeepSeek API實(shí)現(xiàn)PDF轉(zhuǎn)Word的方案
隨著信息化時(shí)代的不斷推進(jìn),PDF和Word文件格式已經(jīng)成為了日常辦公中最常見(jiàn)的文檔格式,在許多工作場(chǎng)景中,我們需要將PDF文件轉(zhuǎn)換成Word格式,本文將介紹如何結(jié)合DeepSeek API與Python,快速實(shí)現(xiàn)一個(gè)PDF轉(zhuǎn)Word的工具,需要的朋友可以參考下2025-02-02
python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法
今天小編就為大家分享一篇python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
解決python3插入mysql時(shí)內(nèi)容帶有引號(hào)的問(wèn)題
今天小編就為大家分享一篇解決python3插入mysql時(shí)內(nèi)容帶有引號(hào)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python字符串str和字節(jié)數(shù)組相互轉(zhuǎn)化方法
下面小編就為大家?guī)?lái)一篇python字符串str和字節(jié)數(shù)組相互轉(zhuǎn)化方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)多層感知機(jī)簡(jiǎn)潔實(shí)現(xiàn)
這篇文章主要為大家講解了Python深層學(xué)習(xí)中pytorch神經(jīng)網(wǎng)絡(luò)多層感知機(jī)的簡(jiǎn)潔實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
使用Docker構(gòu)建Python Flask程序的詳細(xì)教程
在當(dāng)今的軟件開(kāi)發(fā)領(lǐng)域,容器化技術(shù)正變得越來(lái)越流行,而 Docker 無(wú)疑是其中的佼佼者,本文我們就來(lái)聊聊如何使用 Docker 構(gòu)建一個(gè)簡(jiǎn)單的 Python Flask 程序吧2025-07-07

