Python 中的類class實例詳解
更新時間:2026年05月29日 09:44:31 作者:夢想不只是夢與想
這段文章詳細(xì)介紹了Python面向?qū)ο缶幊痰暮诵母拍?文章還強調(diào)了類的命名規(guī)范、實例方法與屬性的區(qū)別、私有屬性的定義及使用@property簡化數(shù)據(jù)類定義的重要性,感興趣的朋友跟隨小編一起看看吧
類是 Python 面向?qū)ο缶幊痰暮诵模糜?strong>定義對象的藍(lán)圖。類封裝了數(shù)據(jù)(屬性)和行為(方法),支持繼承、多態(tài)等特性。
一、類的定義與實例化
1. 基本定義
class Person:
"""定義一個人類"""
# 類屬性(所有實例共享)
species = "human"
# 構(gòu)造方法(初始化實例)
def __init__(self, name, age):
# 實例屬性(每個實例獨立)
self.name = name
self.age = age
# 實例方法
def greet(self):
return f"Hello, I'm {self.name}"
def have_birthday(self):
self.age += 1
return f"Now I'm {self.age}"
# 創(chuàng)建實例
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)
print(person1.name) # Alice
print(person1.greet()) # Hello, I'm Alice
print(person1.species) # human二、類的組成
1. 構(gòu)造方法__init__
class Student:
def __init__(self, name, age, grade="大一"):
self.name = name # 公有屬性
self._age = age # 受保護屬性(約定)
self.__grade = grade # 私有屬性(名稱修飾)
self.scores = [] # 可變屬性
def get_grade(self):
return self.__grade
s = Student("Alice", 20)
print(s.name) # Alice
print(s._age) # 20(可以訪問,但不建議)
# print(s.__grade) # AttributeError(名稱修飾)
print(s.get_grade()) # 大一2. 實例方法、類方法、靜態(tài)方法
class Calculator:
# 類屬性
version = "1.0"
def __init__(self, brand):
self.brand = brand
# 實例方法(需要實例調(diào)用,可以訪問實例屬性)
def add(self, a, b):
return a + b
# 類方法(使用 @classmethod,可以訪問類屬性)
@classmethod
def get_version(cls):
return cls.version
# 靜態(tài)方法(使用 @staticmethod,獨立于類和實例)
@staticmethod
def multiply(a, b):
return a * b
calc = Calculator("Casio")
print(calc.add(3, 5)) # 8(實例方法)
print(Calculator.get_version()) # 1.0(類方法)
print(Calculator.multiply(3, 5))# 15(靜態(tài)方法)3. 屬性裝飾器(@property)
class Circle:
def __init__(self, radius):
self._radius = radius
# getter
@property
def radius(self):
return self._radius
# setter
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("半徑必須大于0")
self._radius = value
@property
def area(self):
"""只讀屬性,沒有 setter"""
return 3.14159 * self._radius ** 2
c = Circle(5)
print(c.radius) # 5
c.radius = 10 # 使用 setter
# c.area = 100 # AttributeError: can't set attribute
print(c.area) # 314.159三、繼承
1. 單繼承
# 父類(基類)
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "一些聲音"
def move(self):
return f"{self.name} 在移動"
# 子類(派生類)
class Dog(Animal):
def speak(self):
return "汪汪"
def wag_tail(self):
return "搖尾巴"
class Cat(Animal):
def speak(self):
return "喵喵"
def climb(self):
return "爬樹"
dog = Dog("旺財")
cat = Cat("咪咪")
print(dog.speak()) # 汪汪(重寫了父類方法)
print(dog.move()) # 旺財 在移動(繼承父類方法)
print(dog.wag_tail()) # 搖尾巴(子類特有)
print(cat.speak()) # 喵喵
print(cat.climb()) # 爬樹2. 多重繼承
class Flyer:
def fly(self):
return "飛行中"
def move(self):
return "飛飛飛"
class Swimmer:
def swim(self):
return "游泳中"
def move(self):
return "游游游"
# 多重繼承(按 MRO 順序查找方法)
class Duck(Flyer, Swimmer):
def move(self):
# 調(diào)用指定父類的方法
return f"{Flyer.move(self)} 并且 {Swimmer.move(self)}"
duck = Duck()
print(duck.fly()) # 飛行中
print(duck.swim()) # 游泳中
print(duck.move()) # 飛飛飛 并且 游游游
print(Duck.__mro__) # 查看方法解析順序3. 使用super()
class Parent:
def __init__(self, name):
self.name = name
print(f"Parent init: {name}")
def greet(self):
return f"Parent: {self.name}"
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # 調(diào)用父類構(gòu)造方法
self.age = age
print(f"Child init: {age}")
def greet(self):
# 調(diào)用父類方法并擴展
parent_greet = super().greet()
return f"{parent_greet}, age {self.age}"
c = Child("Alice", 25)
print(c.greet()) # Parent: Alice, age 25四、多態(tài)
class Shape:
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius ** 2
# 多態(tài):同一接口,不同實現(xiàn)
def print_area(shape):
print(f"面積: {shape.area()}")
shapes = [Rectangle(3, 4), Circle(5)]
for shape in shapes:
print_area(shape)
# 面積: 12
# 面積: 78.53975五、特殊方法(魔術(shù)方法)
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 字符串表示(供開發(fā)者)
def __repr__(self):
return f"Point({self.x}, {self.y})"
# 字符串表示(供用戶)
def __str__(self):
return f"({self.x}, {self.y})"
# 加法
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
# 相等比較
def __eq__(self, other):
return self.x == other.x and self.y == other.y
# 長度(len())
def __len__(self):
return int((self.x ** 2 + self.y ** 2) ** 0.5)
# 可迭代
def __iter__(self):
yield self.x
yield self.y
p1 = Point(3, 4)
p2 = Point(1, 2)
print(str(p1)) # (3, 4)
print(repr(p1)) # Point(3, 4)
print(p1 + p2) # (4, 6)
print(p1 == Point(3, 4)) # True
print(len(p1)) # 5
for coord in p1:
print(coord) # 3, 4六、常用魔術(shù)方法
| 魔術(shù)方法 | 觸發(fā)時機 | 用途 |
|---|---|---|
__init__(self, ...) | 創(chuàng)建實例時 | 初始化屬性 |
__str__(self) | print(obj)、str(obj) | 用戶友好的字符串 |
__repr__(self) | repr(obj)、調(diào)試 | 開發(fā)者友好的字符串 |
__len__(self) | len(obj) | 返回長度 |
__getitem__(self, key) | obj[key] | 索引訪問 |
__setitem__(self, key, value) | obj[key] = value | 索引賦值 |
__iter__(self) | for x in obj | 迭代器 |
__add__(self, other) | obj + other | 加法 |
__eq__(self, other) | obj == other | 相等比較 |
__lt__(self, other) | obj < other | 小于比較 |
__call__(self, ...) | obj() | 對象作為函數(shù)調(diào)用 |
七、數(shù)據(jù)類(dataclass)
from dataclasses import dataclass, field
@dataclass
class Person:
name: str
age: int = 0 # 默認(rèn)值
tags: list = field(default_factory=list) # 可變類型需要 default_factory
# 自動生成 __init__、__repr__、__eq__ 等
def greet(self):
return f"Hello, I'm {self.name}"
p1 = Person("Alice", 25)
p2 = Person("Alice", 25)
p3 = Person("Bob", 30)
print(p1) # Person(name='Alice', age=25)
print(p1 == p2) # True(自動比較屬性)
print(p1 == p3) # False
print(p1.greet()) # Hello, I'm Alice八、抽象類(ABC)
from abc import ABC, abstractmethod
class Vehicle(ABC):
def __init__(self, brand):
self.brand = brand
@abstractmethod
def start(self):
"""抽象方法,子類必須實現(xiàn)"""
pass
@abstractmethod
def stop(self):
pass
def honk(self):
"""普通方法,子類可以直接繼承"""
return "滴滴"
class Car(Vehicle):
def start(self):
return f"{self.brand} 汽車啟動"
def stop(self):
return f"{self.brand} 汽車停止"
# vehicle = Vehicle() # TypeError: 不能實例化抽象類
car = Car("Tesla")
print(car.start()) # Tesla 汽車啟動
print(car.honk()) # 滴滴九、屬性訪問控制
class User:
def __init__(self, name):
self._name = name # 受保護(約定)
self.__password = "123" # 私有(名稱修飾)
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if not value:
raise ValueError("名字不能為空")
self._name = value
@property
def password(self):
return "***" # 只讀屬性,不返回真實密碼
u = User("Alice")
print(u.name) # Alice
u.name = "Bob"
# u.name = "" # ValueError
print(u._name) # Bob(可以訪問,但遵守約定不直接訪問)
print(u.password) # ***
# print(u.__password) # AttributeError(名稱修飾)來一個總結(jié)把
| 概念 | 說明 |
|---|---|
| 類 | 對象的藍(lán)圖 |
| 實例 | 根據(jù)類創(chuàng)建的具體對象 |
| 實例屬性 | 每個實例獨有的屬性(self.attr) |
| 類屬性 | 所有實例共享的屬性(直接在類中定義) |
| 實例方法 | 第一個參數(shù)是 self,操作實例屬性 |
| 類方法 | 使用 @classmethod,第一個參數(shù)是 cls |
| 靜態(tài)方法 | 使用 @staticmethod,無特殊參數(shù) |
| 繼承 | 子類繼承父類的屬性和方法 |
| 多態(tài) | 同一方法名在不同類中有不同實現(xiàn) |
| 屬性裝飾器 | @property、@setter、@deleter |
| 魔術(shù)方法 | 以雙下劃線開頭和結(jié)尾的特殊方法 |
要點:
- 類命名用駝峰命名法(如
MyClass) - 實例方法第一個參數(shù)必須是
self - 使用
__init__初始化實例屬性 - 私有屬性用雙下劃線開頭(
__name) - 使用
@property實現(xiàn) getter/setter dataclass簡化數(shù)據(jù)類定義
到此這篇關(guān)于Python 中的類class實例詳解的文章就介紹到這了,更多相關(guān)Python類class內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實現(xiàn)給企業(yè)微信發(fā)送消息功能
本文將介紹如何使用python3給企業(yè)微信發(fā)送消息,文中有詳細(xì)的圖文解說及代碼示例,對正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下2021-12-12
python的print輸出在控制臺并且將輸出內(nèi)容保存為文件(最新推薦)
這篇文章主要介紹了python的print輸出在控制臺并且將輸出內(nèi)容保存為文件,我感覺就是類似于重寫一下調(diào)用print的時候執(zhí)行的方法,讓他既能夠在控制臺輸出,也能保存到文件里去,需要的朋友可以參考下2023-01-01
Tensorflow矩陣運算實例(矩陣相乘,點乘,行/列累加)
今天小編就為大家分享一篇Tensorflow矩陣運算實例(矩陣相乘,點乘,行/列累加),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
numpy.random.shuffle打亂順序函數(shù)的實現(xiàn)
這篇文章主要介紹了numpy.random.shuffle打亂順序函數(shù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

