源代碼:
class Students:stats="大學"def __init__(self,name,age,sex,credit):self.name=nameself.age=ageself.sex=sexself.credit=creditdef tell(self):return f"{self.name}說:你好"class Teachers(Students):stats="教師"def __init__(self, name, age, sex,pay):super().__init__(name, age, sex,0)self.pay=paydef tell(self):return f"{self.name}說:我不好"
student=Students("大炮",21,"男",10)
print(student.tell())
print(student.stats)
print(student.credit)teacher=Teachers("富貴",55,"男",10000)
print(teacher.tell())
print(teacher.stats)
print(teacher.pay)
代碼詳解:
Python 類(Class)完全新手教程:從零理解面向對象編程
一、為什么需要類?真實世界類比
想象你要管理一所大學的學生和教師信息。沒有類時,你需要這樣存儲數據:
# 學生信息
student1_name = "大炮"
student1_age = 21
student1_sex = "男"
student1_credit = 10# 教師信息
teacher1_name = "富貴"
teacher1_age = 55
teacher1_sex = "男"
teacher1_pay = 10000
這種方式的三大問題:
數據分散:相關信息分散在不同變量中
管理困難:添加新學生需要創建多個變量
行為缺失:無法定義與數據相關的操作(如自我介紹)
類的解決方案:
class Person:def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexdef introduce(self):return f"我是{self.name},{self.age}歲"student = Person("大炮", 21, "男")
teacher = Person("富貴", 55, "男")
二、類的基本結構詳解
學生類代碼分析
class Students: # 1. 類定義stats = "大學" # 2. 類屬性# 3. 構造方法def __init__(self, name, age, sex, credit):# 4. 實例屬性初始化self.name = nameself.age = ageself.sex = sexself.credit = credit# 5. 實例方法def tell(self):return f"{self.name}說:你好"
五個核心組件:
類定義:
class 類名:
類名使用大駝峰命名法(如
Students
)創建對象的藍圖
類屬性:
定義在類內部,方法外部
所有對象共享同一值
print(Students.stats) # "大學"
構造方法?
__init__
:創建對象時自動調用
self
?參數代表當前對象(必須存在)用于初始化對象狀態
實例屬性:
在
__init__
中通過self.屬性名=值
定義每個對象有獨立副本
student1 = Students("小明", 20, "男", 5) student2 = Students("小紅", 19, "女", 8) print(student1.name) # "小明" print(student2.name) # "小紅"(不同值)
實例方法:
定義在類中的函數
第一個參數必須是
self
通過對象調用:
對象.方法()
print(student1.tell()) # "小明說:你好"
三、創建和使用對象:從藍圖到實體
實例化過程
# 創建學生對象
student = Students("大炮", 21, "男", 10)
內存中發生了什么:
Python 在內存中分配新空間
調用?
__init__
?方法:Students.__init__(student, "大炮", 21, "男", 10)
初始化屬性:
student.name = "大炮" student.age = 21 student.sex = "男" student.credit = 10
訪問對象成員
# 訪問屬性
print(student.name) # "大炮"(實例屬性)
print(student.stats) # "大學"(類屬性)# 調用方法
print(student.tell()) # "大炮說:你好"
📌?重要提示:類屬性 vs 實例屬性
Students.stats = "學院" # 修改類屬性 print(student.stats) # 輸出"學院"(所有對象同步改變)student.name = "小炮" # 修改實例屬性 print(student.name) # 輸出"小炮"(僅影響當前對象)
四、繼承:創建教師類
繼承是面向對象的核心概念,允許我們基于現有類創建新類。
你的教師類代碼分析
class Teachers(Students): # 1. 繼承語法stats = "教師" # 2. 重寫類屬性# 3. 重寫構造方法def __init__(self, name, age, sex, pay):# 4. 調用父類構造方法super().__init__(name, age, sex, 0) # 學分設為0self.pay = pay # 5. 添加新屬性# 6. 重寫方法def tell(self):return f"{self.name}說:我不好"
繼承六大要點:
繼承語法:
class 子類(父類)
教師類繼承學生類的所有屬性和方法
重寫類屬性:
子類定義同名屬性覆蓋父類
python
print(Teachers.stats) # "教師"(而非"大學")
重寫構造方法:
子類可以定義自己的
__init__
super()函數:
調用父類的方法
super().__init__(參數)
?初始化繼承的屬性必須放在子類構造方法開頭
添加新屬性:
self.pay = pay # 教師特有屬性
重寫方法:
定義同名方法覆蓋父類實現
teacher.tell() # 調用子類版本:"富貴說:我不好"
繼承關系圖解
五、完整代碼執行流程分析
# ====== 學生部分 ======
student = Students("大炮", 21, "男", 10)# 1. 創建Students對象
# 2. 調用__init__:設置name="大炮", age=21, sex="男", credit=10
# 3. 類屬性stats="大學"print(student.tell()) # 4. 調用tell() → "大炮說:你好"
print(student.stats) # 5. 訪問類屬性 → "大學"
print(student.credit) # 6. 訪問實例屬性 → 10# ====== 教師部分 ======
teacher = Teachers("富貴", 55, "男", 10000)# 7. 創建Teachers對象
# 8. 調用Teachers.__init__
# 9. 在Teachers.__init__中:
# - super().__init__(name, age, sex, 0) → 調用Students.__init__
# - 設置pay=10000
# 10. 類屬性stats="教師"(覆蓋父類)print(teacher.tell()) # 11. 調用重寫的tell() → "富貴說:我不好"
print(teacher.stats) # 12. 訪問重寫的類屬性 → "教師"
print(teacher.pay) # 13. 訪問新增屬性 → 10000
print(teacher.credit) # 14. 訪問繼承屬性 → 0
六、常見問題解決方案(基于真實錯誤)
問題1:忘記self參數
# 錯誤:方法缺少self
def tell(): # ? 缺少selfreturn "你好"# 正確:
def tell(self): # ?return f"{self.name}說:你好"
問題2:屬性初始化錯誤
# 錯誤:未正確賦值
self.credit # ? 缺少賦值操作# 正確:
self.credit = credit # ?
問題3:繼承時參數不匹配
# 錯誤:父類需要4個參數,只傳了3個
super().__init__(name, age, sex) # ?# 正確:添加缺失參數
super().__init__(name, age, sex, 0) # ?
問題4:混淆類屬性和實例屬性
# 錯誤:在方法中錯誤定義類屬性
def __init__(self, name):self.stats = "學院" # ? 這是實例屬性# 正確定義類屬性:
class Students:stats = "大學" # ? 類屬性
七、類設計最佳實踐
單一職責原則:每個類只負責一個功能領域
命名規范:
類名:大駝峰?
UniversityPerson
方法名:小寫蛇形?
calculate_grade
屬性名:小寫蛇形?
student_id
封裝思想:隱藏內部細節,暴露必要接口
class BankAccount:def __init__(self, balance):self.__balance = balance # 私有屬性def deposit(self, amount): # 公開接口if amount > 0:self.__balance += amount
使用屬性裝飾器:
class Circle:def __init__(self, radius):self.radius = radius@propertydef area(self): # 作為屬性訪問return 3.14 * self.radius ** 2c = Circle(5) print(c.area) # 78.5(不是c.area())
八、擴展練習:打造校園管理系統
# 1. 添加課程類
class Course:def __init__(self, name, credit):self.name = nameself.credit = creditself.students = []def enroll(self, student):self.students.append(student)student.credit += self.creditreturn f"{student.name}已選課《{self.name}》"# 2. 改進學生類
class Students:# ...原有代碼...def take_course(self, course):return course.enroll(self)# 3. 使用示例
math = Course("高等數學", 4)
student = Students("小明", 20, "男", 0)print(student.take_course(math)) # 小明已選課《高等數學》
print(f"小明學分:{student.credit}") # 4
print(f"選課學生:{[s.name for s in math.students]}") # ['小明']
九、學習路徑建議
基礎階段:
創建簡單類(如
Book
,Car
)練習
__init__
和屬性定義添加基本方法
中級階段:
實現類繼承(如
ElectricCar
繼承Car
)使用方法重寫
學習
super()
的使用
高級階段:
掌握特殊方法(
__str__
,__len__
)使用屬性裝飾器
@property
實現簡單的類關系(如學生-課程關系)
項目實踐:
💡?終極建議:從你的學生/教師類出發,逐步添加:
成績管理功能
課程表系統
校園卡消費功能
數據持久化(存儲到文件)
掌握類的核心概念后,你將能夠構建更復雜、更易維護的Python程序!🚀