在 python 的世界里,class 不仅仅是一个语法结构,它是构建复杂系统、实现面向对象编程(oop)的核心工具。通过类,我们可以创建自定义数据类型,让程序不仅仅是处理数字和字符串,而是能表达现实世界中的概念,比如“汽车”、“用户”、“订单”等。今天,我们就来深入探讨 类的定义与实例化,并用大量代码示例带你从零开始掌握这一核心技能。
什么是类?—— 自定义数据类型的蓝图
在现实生活中,我们看到一辆车,会说:“这是一辆特斯拉”。但如果我们想在代码中表示“一辆特斯拉”,该怎么办?直接用 str("tesla")?还是用 dict(model="model s", brand="tesla")?
虽然这些方式可行,但它们缺乏语义性和可扩展性。而类正是为了解决这个问题而诞生的。
类(class) 是一种模板或蓝图,用于定义具有相同属性和行为的对象。
想象一下,你正在设计一个“学生”系统。每个学生都有名字、年龄、成绩等信息,并且可以进行“学习”、“考试”等操作。这时候,就可以定义一个 student 类:
class student:
def __init__(self, name, age):
self.name = name
self.age = age
self.grades = []
def add_grade(self, grade):
self.grades.append(grade)
def get_average(self):
if not self.grades:
return 0
return sum(self.grades) / len(self.grades)
def study(self):
print(f"{self.name} is studying hard! 📚")
这段代码定义了一个 student 类,它包含了:
- 属性(attributes):
name,age,grades - 方法(methods):
add_grade(),get_average(),study()
现在,我们可以通过这个类创建多个“学生”对象,每一个都是独立的实例。
实例化:从蓝图到真实对象
类是蓝图,但只有当你“实例化”它时,才会真正生成一个对象。实例化就是使用类来创建一个具体的对象。
实例化语法
student1 = student("alice", 20)
student2 = student("bob", 22)
这里,student1 和 student2 就是两个独立的 student 对象。它们都拥有相同的属性结构,但值不同。
检查实例的属性
print(student1.name) # alice
print(student2.age) # 22
student1.add_grade(85)
student1.add_grade(90)
print(f"average: {student1.get_average()}") # average: 87.5
注意:每个实例都有自己的一套属性副本,互不影响。
__init__方法:构造函数的魔法
__init__ 是类中最关键的方法之一,也被称为构造函数。它在每次创建新实例时自动调用。
class car:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
self.mileage = 0
self.is_running = false
def start_engine(self):
self.is_running = true
print(f"{self.brand} {self.model} engine started! 🚗💨")
def drive(self, miles):
if self.is_running:
self.mileage += miles
print(f"drove {miles} miles. total mileage: {self.mileage}")
else:
print("engine is off! start the car first.")
def __str__(self):
return f"{self.year} {self.brand} {self.model}"
重点说明:
__init__接收参数,并将它们赋值给self。self指代当前实例,是所有实例方法的第一个参数。__str__是一个特殊方法,用于定义对象的字符串表示形式。
my_car = car("toyota", "camry", 2023)
print(my_car) # 2023 toyota camry
my_car.start_engine()
my_car.drive(100)
输出:
2023 toyota camry
toyota camry engine started! 🚗💨
drove 100 miles. total mileage: 100
类属性 vs 实例属性:谁属于谁?
理解类属性和实例属性的区别,是进阶的关键。
| 属性类型 | 定义位置 | 共享性 | 示例 |
|---|---|---|---|
| 实例属性 | 在 __init__ 中定义 | 每个实例独立 | self.name |
| 类属性 | 在类内部、方法外部定义 | 所有实例共享 | car.total_cars = 0 |
实例属性:每个对象独有
class dog:
def __init__(self, name, breed):
self.name = name # 实例属性
self.breed = breed # 实例属性
类属性:全类共享
class dog:
species = "canis lupus familiaris" # 类属性
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
print(f"{self.name} says: woof! 🐶")
# 所有实例共享 species
dog1 = dog("buddy", "golden retriever")
dog2 = dog("max", "labrador")
print(dog1.species) # canis lupus familiaris
print(dog2.species) # canis lupus familiaris
# 可以通过类名修改
dog.species = "canis familiaris"
print(dog1.species) # canis familiaris
注意:如果在实例上修改类属性,会创建一个同名的实例属性,遮蔽类属性。
dog1.species = "new species" print(dog1.species) # new species (实例属性) print(dog2.species) # canis familiaris (类属性未变)
使用 mermaid 绘制类关系图
让我们用 mermaid 来可视化一个简单的类结构:

这张图展示了:
animal是基类(父类)dog和cat继承自animal- 继承关系用
<|--表示
你可以将这段 mermaid 代码粘贴到 mermaid live editor 网站中实时预览图形效果。
方法类型:实例方法、类方法、静态方法
实例方法(instance method)
最常见的一种方法,第一个参数是 self,只能由实例调用。
def introduce(self):
return f"i am {self.name}, a {self.breed}."
类方法(class method)
用 @classmethod 装饰器定义,第一个参数是 cls,代表类本身。
常用于工厂模式或创建替代构造函数。
class rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@classmethod
def from_square(cls, side_length):
return cls(side_length, side_length)
def area(self):
return self.width * self.height
# 用类方法创建正方形
square = rectangle.from_square(5)
print(square.area()) # 25
静态方法(static method)
用 @staticmethod 装饰器定义,不接收 self 或 cls,像普通函数一样使用。
适合封装与类相关的工具函数。
class mathutils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(n):
return n % 2 == 0
print(mathutils.add(3, 4)) # 7
print(mathutils.is_even(6)) # true
总结:
instance method: 用self,操作实例class method: 用cls,操作类static method: 无上下文,纯工具函数
特殊方法(magic methods)—— 让类更 pythonic
python 提供了一系列以双下划线开头和结尾的方法,称为“魔术方法”(magic methods),让你可以自定义对象的行为。
| 方法 | 用途 |
|---|---|
__str__() | 定义 print(obj) 的输出 |
__repr__() | 定义调试时的字符串表示 |
__len__() | 支持 len(obj) |
__eq__() | 支持 == 比较 |
__add__() | 支持 + 操作 |
示例:自定义向量类
class vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return f"vector({self.x}, {self.y})"
def __repr__(self):
return f"vector({self.x}, {self.y})"
def __len__(self):
return 2
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __add__(self, other):
return vector(self.x + other.x, self.y + other.y)
def magnitude(self):
return (self.x**2 + self.y**2)**0.5
# 测试
v1 = vector(3, 4)
v2 = vector(1, 2)
print(v1) # vector(3, 4)
print(len(v1)) # 2
print(v1 == v2) # false
print(v1 + v2) # vector(4, 6)
print(v1.magnitude()) # 5.0
有了这些方法,你的类就真正“融入”了 python 的生态系统!
封装:保护数据安全
封装是 oop 的三大支柱之一(封装、继承、多态)。通过私有属性和方法,防止外部随意修改内部状态。
私有属性(命名约定)
python 没有真正的私有访问控制,但通过命名约定表示“私有”。
- 单下划线
_:受保护,建议不要直接访问 - 双下划线
__:名称改写,外部无法直接访问
class bankaccount:
def __init__(self, owner, balance=0):
self.owner = owner
self._balance = balance # 受保护
self.__pin = "1234" # 私有
def deposit(self, amount):
if amount > 0:
self._balance += amount
print(f"deposited {amount}. new balance: {self._balance}")
def withdraw(self, amount, pin):
if pin == self.__pin and amount <= self._balance:
self._balance -= amount
print(f"withdrew {amount}. remaining: {self._balance}")
else:
print("invalid pin or insufficient funds.")
def get_balance(self):
return self._balance
def __str__(self):
return f"account of {self.owner}: ${self._balance}"
# 用法
account = bankaccount("alice", 1000)
account.deposit(500)
account.withdraw(200, "1234")
print(account) # account of alice: $1300
但注意:__pin 被改名为 _bankaccount__pin,仍可通过 account._bankaccount__pin 访问,因此不能完全隐藏。
继承:代码复用的利器
继承允许你创建一个新类,基于已有类,继承其属性和方法。
class vehicle:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def start(self):
print(f"{self.brand} {self.model} is starting...")
def stop(self):
print(f"{self.brand} {self.model} is stopping...")
class electriccar(vehicle):
def __init__(self, brand, model, battery_capacity):
super().__init__(brand, model)
self.battery_capacity = battery_capacity
def charge(self):
print(f"charging {self.brand} {self.model}... battery: {self.battery_capacity}%")
def start(self): # 重写父类方法
print(f"silent start: {self.brand} {self.model} powered by electricity! 🌿")
# 使用
tesla = electriccar("tesla", "model 3", 90)
tesla.start() # silent start: tesla model 3 powered by electricity! 🌿
tesla.charge() # charging tesla model 3... battery: 90%
tesla.stop() # tesla model 3 is stopping...
super() 用于调用父类方法,避免重复代码。
多态:同一接口,多种实现
多态是指同一个方法,在不同类中表现出不同行为。
class shape:
def area(self):
raise notimplementederror("subclasses must implement area()")
class circle(shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius ** 2
class rectangle(shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# 多态演示
shapes = [circle(5), rectangle(4, 6)]
for shape in shapes:
print(f"area: {shape.area()}") # 78.53975, 24
同一调用 area(),但根据实际类型执行不同逻辑。
实战案例:简易博客系统
我们来构建一个完整的类系统,模拟一个博客平台。
class post:
def __init__(self, title, content, author):
self.title = title
self.content = content
self.author = author
self.likes = 0
self.comments = []
def like(self):
self.likes += 1
print(f"👍 {self.author} liked '{self.title}'!")
def add_comment(self, comment):
self.comments.append(comment)
print(f"💬 comment added to '{self.title}'")
def __str__(self):
return f"📝 {self.title} by {self.author} ({self.likes} likes)"
# 博客管理器
class blog:
def __init__(self):
self.posts = []
def create_post(self, title, content, author):
post = post(title, content, author)
self.posts.append(post)
print(f"✅ post '{title}' created!")
return post
def display_all_posts(self):
for post in self.posts:
print(post)
# 测试
blog = blog()
post1 = blog.create_post("my first post", "hello world!", "alice")
post1.like()
post1.add_comment("great post!")
blog.display_all_posts()
输出:
✅ post 'my first post' created!
👍 alice liked 'my first post'!
💬 comment added to 'my first post'
📝 my first post by alice (1 likes)
总结:类的终极价值
通过本篇教程,我们掌握了:
- 如何定义类
- 如何实例化对象
__init__构造函数的作用- 属性分类(实例/类)
- 方法类型(实例/类/静态)
- 特殊方法(
__str__,__eq__等) - 封装与私有机制
- 继承与多态
- 实战项目应用
类的本质:把“数据”和“行为”打包成一个整体,让你的代码更清晰、可维护、可扩展。
以上就是python进阶指南之类的定义与实例化完整教学的详细内容,更多关于python类定义与实例化的资料请关注代码网其它相关文章!
发表评论