本文目录导读:

我来为您详细介绍Python构造方法的用法及相关案例。
基本构造方法 __init__
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
print(f"创建了Person对象: {self.name}, {self.age}岁")
# 创建对象
p1 = Person("张三", 25)
p2 = Person("李四", 30)
带默认参数的构造方法
class Student:
def __init__(self, name, grade="一年级", age=18):
self.name = name
self.grade = grade
self.age = age
self.scores = [] # 初始化空列表
def add_score(self, score):
self.scores.append(score)
# 创建对象 - 不同方式
s1 = Student("小明") # 使用默认参数
s2 = Student("小红", "二年级") # 部分指定
s3 = Student("小刚", "三年级", 20) # 全部指定
print(f"{s1.name}: {s1.grade}, {s1.age}岁")
print(f"{s2.name}: {s2.grade}, {s2.age}岁")
带类型检查的构造方法
class BankAccount:
def __init__(self, account_number, balance=0):
# 参数验证
if not isinstance(account_number, str) or len(account_number) != 10:
raise ValueError("账号必须是10位字符串")
if not isinstance(balance, (int, float)) or balance < 0:
raise ValueError("余额必须是非负数字")
self.account_number = account_number
self.balance = balance
self.transactions = []
# 正确创建
account = BankAccount("1234567890", 1000)
# 错误创建会抛出异常
# account = BankAccount("123", -100) # 会报错
计算属性的初始化
import math
class Circle:
def __init__(self, radius):
self.radius = radius
self.area = math.pi * radius ** 2 # 自动计算面积
self.circumference = 2 * math.pi * radius # 自动计算周长
# 创建对象
circle = Circle(5)
print(f"半径: {circle.radius}")
print(f"面积: {circle.area:.2f}")
print(f"周长: {circle.circumference:.2f}")
组合对象初始化
class Address:
def __init__(self, city, street, zip_code):
self.city = city
self.street = street
self.zip_code = zip_code
class Employee:
def __init__(self, name, city, street, zip_code, salary=5000):
self.name = name
self.address = Address(city, street, zip_code) # 组合其他对象
self.salary = salary
def __str__(self):
return f"{self.name}, 住在{self.address.city}, 薪资{self.salary}"
# 创建对象
emp = Employee("王五", "北京", "长安街100号", "100000", 8000)
print(emp)
工厂方法模式初始化
class Temperature:
def __init__(self, kelvin):
"""统一使用开尔文存储"""
self.kelvin = kelvin
@classmethod
def from_celsius(cls, celsius):
"""从摄氏温度创建"""
return cls(celsius + 273.15)
@classmethod
def from_fahrenheit(cls, fahrenheit):
"""从华氏温度创建"""
return cls((fahrenheit - 32) * 5/9 + 273.15)
def __str__(self):
return f"{self.kelvin:.2f}K"
# 使用不同的方式创建对象
t1 = Temperature(300) # 直接创建
t2 = Temperature.from_celsius(100) # 从摄氏创建
t3 = Temperature.from_fahrenheit(212) # 从华氏创建
print(f"300K = {t1}")
print(f"100°C = {t2}")
print(f"212°F = {t3}")
单例模式初始化
class DatabaseConnection:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.initialize()
return cls._instance
def initialize(self):
"""初始化数据库连接"""
self.connection_string = "mysql://localhost:3306/mydb"
self.connected = False
print("初始化数据库连接...")
# 创建对象 - 两次创建得到同一个实例
db1 = DatabaseConnection()
db2 = DatabaseConnection()
print(f"db1 is db2: {db1 is db2}") # 输出: True
完整的实际案例
class Book:
def __init__(self, title, author, isbn, pages=0):
# 参数验证
if not title or not isinstance(title, str):
raise ValueError("书名不能为空且必须是字符串")
if not author or not isinstance(author, str):
raise ValueError("作者不能为空且必须是字符串")
# 初始化核心属性
self.title = title
self.author = author
self.isbn = isbn
self.pages = pages
self.current_page = 0
self.is_open = False
self.reading_count = 0
# 自动生成衍生属性
self.summary = f"《{title}》- {author}"
print(f"新书入库: {self.summary}")
def open_book(self, page=1):
self.is_open = True
self.current_page = page
self.reading_count += 1
print(f"打开《{self.title}》,跳到第{page}页")
def __str__(self):
status = "已打开" if self.is_open else "未打开"
return f"《{self.title}》({status}, 第{self.current_page}页)"
# 使用示例
try:
# 创建书籍对象
book = Book("Python编程", "张三", "978-7-111-12345-6", 300)
# 使用对象
book.open_book(50)
print(book)
# 错误创建会抛出异常
# invalid_book = Book("", "作者", "123")
except ValueError as e:
print(f"创建失败: {e}")
__init__不是构造函数:对象创建时先调用__new__,然后调用__init__初始化- 参数验证:在初始化时进行参数检查,确保对象状态正确
- 默认参数:为常用参数提供默认值,提高灵活性
- 组合模式:在构造方法中创建其他对象,实现对象组合
- 计算属性:基于入参自动计算并设置衍生属性
这些案例涵盖了Python中初始化对象的常见模式和最佳实践。