0

0

如何在 Python 中使用重载构造函数初始化单个对象或对象列表

心靈之曲

心靈之曲

发布时间:2026-03-03 09:14:03

|

143人浏览过

|

来源于php中文网

原创

如何在 Python 中使用重载构造函数初始化单个对象或对象列表

本文详解 Python 中如何正确初始化单个对象及对象列表,重点纠正 extend() 误用导致的 TypeError,并演示基于构造函数的批量实例化、封装规范与实用技巧。

本文详解 python 中如何正确初始化单个对象及对象列表,重点纠正 `extend()` 误用导致的 typeerror,并演示基于构造函数的批量实例化、封装规范与实用技巧。

在 Python 面向对象编程中,合理初始化对象是构建健壮程序的基础。以 Account 类为例,其构造函数接收三个参数(IBAN、户名、余额),具备典型的封装特性:私有属性(__ 前缀)、公有访问器(getter)和业务方法(如 deposit/withdraw)。但实际使用中,常见误区会破坏对象创建逻辑——尤其在批量初始化时。

❌ 错误实践分析:混淆 append() 与 extend()

原始代码中关键错误出现在这一行:

self.accounts.extend(Account)

list.extend(iterable) 要求传入可迭代对象(如 list、tuple、str),而 Account 是单个实例(不可迭代),因此触发 TypeError: 'Account' object is not iterable。

此外,还有多处设计问题需同步修正:

立即学习Python免费学习笔记(深入)”;

  • TestAccount 不应继承 Account:它并非 Account 的子类,而是负责管理账户集合的测试协调类,应采用组合(composition)而非继承(inheritance);
  • createAccount() 方法逻辑错误:它试图用 self 的当前属性(此时未初始化)构造新对象,且参数顺序错乱(self.__account_holder_name 被重复传给 account_number_IBAN);
  • __str__ 方法返回元组而非字符串,导致打印异常;
  • withdraw() 的条件分支存在逻辑漏洞(如 elif self.__balance 0 为假时才执行,但前序 elif amount > 0 已覆盖该情况)。

✅ 正确实现:批量初始化对象列表

以下是重构后的专业写法,清晰分离职责、修复语法与逻辑缺陷:

Mokker AI
Mokker AI

AI产品图添加背景

下载
# Account.py
class Account:
    def __init__(self, account_number_IBAN: str, account_holder_name: str, balance: float = 0.0):
        self.__account_holder_name = account_holder_name
        self.__account_number_IBAN = account_number_IBAN
        self.__balance = max(0.0, balance)  # 确保余额非负

    # Getter 方法(保持原有命名,亦可改用 @property)
    def get_AccountHolder_Name(self):
        return self.__account_holder_name

    def get_AccountHolder_IBAN(self):
        return self.__account_number_IBAN

    def get_Balance(self):
        return self.__balance

    # 修正 __str__:返回格式化字符串
    def __str__(self):
        return (f"Account Holder Name: {self.__account_holder_name}\n"
                f"Account Holder's IBAN: {self.__account_number_IBAN}\n"
                f"Account Balance: ${self.__balance:.2f}")

    def deposit(self, amount: float):
        if amount > 0:
            self.__balance += amount
        else:
            print("Error: Deposit amount must be greater than 0.")

    def withdraw(self, amount: float):
        if amount <= 0:
            print("Error: Withdrawal amount must be greater than 0.")
        elif amount > self.__balance:
            print("Error: Insufficient funds for withdrawal.")
        else:
            self.__balance -= amount
# TestAccount.py
from Account import Account

class TestAccount:
    def __init__(self):
        # 测试数据(确保长度一致:10 个账户)
        self.account_ID_List = [
            "DE44500105170000000001", "FR1420041010050500013M02606",
            "GB29NWBK60161331926819", "IT60X0542811101000000123456",
            "ES9121000418450200051332", "NL91ABNA0417164300", 
            "BE68539007547034", "CH9300762011623852957", 
            "AT483200000012345864", "SE4550000000058398257466"
        ]
        self.account_Holder_Name = [
            "KASH", "ARRAIN", "ZAHEER", "AMJAD", "JOHN",
            "SURESH", "SAIIN", "CHAUDHARAIN", "SARDAR", "BLOSSOM"
        ]
        self.account_balance = [0.0, 100.5, 23.75, 555.0, 10000.0,
                                0.0, 99.99, 342.1, 0.0, 2131.42]

        # 初始化空列表,用于存储 Account 实例
        self.accounts = []

        # 批量创建并添加账户(核心修正点)
        for i in range(len(self.account_ID_List)):
            acc = Account(
                account_number_IBAN=self.account_ID_List[i],
                account_holder_name=self.account_Holder_Name[i],
                balance=self.account_balance[i]
            )
            self.accounts.append(acc)  # ✅ 正确:添加单个对象

    def printAllAccountsInfo(self):
        if not self.accounts:
            print("No accounts to display.")
            return
        for idx, acc in enumerate(self.accounts, 1):
            print(f"\n--- Account #{idx} ---")
            print(acc)  # 自动调用 __str__

# 使用示例
if __name__ == "__main__":
    test = TestAccount()
    test.printAllAccountsInfo()

⚠️ 关键注意事项与最佳实践

  • append() vs extend()

    • list.append(item) → 添加单个元素(任何类型均可);
    • list.extend(iterable) → 将可迭代对象的每个元素逐个加入列表(如 lst.extend([a,b,c]) 等价于 lst.append(a); lst.append(b); lst.append(c))。
  • 避免继承滥用:TestAccount 是工具类,不共享 Account 的行为契约,继承会引入不必要的耦合和 super().__init__() 调用歧义。

  • 数据一致性校验:初始化前确保 account_ID_List、account_Holder_Name、account_balance 三者长度相等,建议增加断言:

    assert len(self.account_ID_List) == len(self.account_Holder_Name) == len(self.account_balance), \
        "Account data lists must have identical lengths."
  • 类型提示增强可维护性:为 __init__ 参数添加类型注解(如 str, float),配合 IDE 和静态检查工具提升可靠性。

  • 防御性编程:__init__ 中对 balance 做 max(0.0, balance) 处理,防止非法负值入库。

通过以上重构,你不仅能解决 TypeError,更能建立符合 Python 习惯、易于扩展与测试的对象初始化模式。批量创建对象的本质,是循环调用构造函数 + append() 收集,简洁、高效、无歧义。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

593

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

57

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

62

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号