Python构造方法案例如何初始化对象

wen python案例 23

本文目录导读:

Python构造方法案例如何初始化对象

  1. 基本构造方法 __init__
  2. 带默认参数的构造方法
  3. 带类型检查的构造方法
  4. 计算属性的初始化
  5. 组合对象初始化
  6. 工厂方法模式初始化
  7. 单例模式初始化
  8. 完整的实际案例

我来为您详细介绍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}")
  1. __init__ 不是构造函数:对象创建时先调用 __new__,然后调用 __init__ 初始化
  2. 参数验证:在初始化时进行参数检查,确保对象状态正确
  3. 默认参数:为常用参数提供默认值,提高灵活性
  4. 组合模式:在构造方法中创建其他对象,实现对象组合
  5. 计算属性:基于入参自动计算并设置衍生属性

这些案例涵盖了Python中初始化对象的常见模式和最佳实践。

抱歉,评论功能暂时关闭!