本文目录导读:

我来为您详细介绍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中初始化对象的常见模式和最佳实践。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播