0

0

如何将布尔函数转换为类方法:Python 中 between 方法的正确实现

碧海醫心

碧海醫心

发布时间:2026-02-17 09:21:13

|

515人浏览过

|

来源于php中文网

原创

如何将布尔函数转换为类方法:Python 中 between 方法的正确实现

本文详解如何将独立的布尔函数重构为 MyTime 类的实例方法,重点解决参数绑定错误、逻辑边界处理及时间比较的完整性问题,并提供可直接运行的修正代码。

本文详解如何将独立的布尔函数重构为 `mytime` 类的实例方法,重点解决参数绑定错误、逻辑边界处理及时间比较的完整性问题,并提供可直接运行的修正代码。

在面向对象编程中,将功能逻辑从“外部函数”迁移至“类方法”不仅是语法调整,更是职责归属的合理化过程。本教程以 MyTime 类为例,系统讲解如何正确实现 between 方法——一个判断当前时间是否严格位于两个给定时间之间的布尔方法(闭左开右区间:t1

? 常见错误剖析:为什么出现 TypeError: between() missing 1 required positional argument: 't3'?

该错误源于对 Python 方法调用机制的误解。当定义如下独立函数时:

def between(self, t1, t2, t3):  # ❌ 错误:free function 不应含 self
    ...

再调用 between(t1, t2, t3),Python 会尝试将 t1 绑定给 self,t2 绑定给 t1,t3 绑定给 t2,而 t3 参数无值可填 → 报错。更根本的问题是:此函数本就不该脱离类存在。

✅ 正确做法是将其作为 实例方法 定义在 MyTime 类内部,且签名必须匹配调用习惯:obj.between(start, end) 意味着方法需接收 3 个参数:self(隐式传入)、start 和 end(显式传入)。

畅图
畅图

AI可视化工具

下载

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

✅ 正确实现:基于已有比较运算符的健壮 between 方法

你已实现了 __lt__(

class MyTime:
    def __init__(self, hrs=0, mins=0, secs=0):
        total_secs = hrs * 3600 + mins * 60 + secs
        self.hrs = total_secs // 3600
        leftover = total_secs % 3600
        self.mins = leftover // 60
        self.secs = leftover % 60

    def __str__(self):
        return f"{self.hrs:02d}:{self.mins:02d}:{self.secs:02d}"

    # 已正确定义的比较方法(关键!)
    def __lt__(self, other):
        if self.hrs != other.hrs:
            return self.hrs < other.hrs
        if self.mins != other.mins:
            return self.mins < other.mins
        return self.secs < other.secs

    def __eq__(self, other):
        return (self.hrs, self.mins, self.secs) == (other.hrs, other.mins, other.secs)

    def __le__(self, other):
        return self < other or self == other

    # ✅ 核心:正确的 between 方法(闭左开右:t1 <= self < t2)
    def between(self, start, end):
        """
        判断当前时间是否满足:start <= self < end

        Args:
            start (MyTime): 区间起始时间(包含)
            end (MyTime): 区间结束时间(不包含)

        Returns:
            bool: 满足条件返回 True,否则 False
        """
        return start.__le__(self) and self.__lt__(end)
        # 等价写法(更推荐,利用运算符重载):
        # return start <= self < end

? 注意:start

? 使用示例与验证

# 测试代码
if __name__ == "__main__":
    t1 = MyTime(1, 3, 30)   # 01:03:30
    t2 = MyTime(1, 4, 16)   # 01:04:16
    t3 = MyTime(3, 4, 26)   # 03:04:26

    print(f"t1 = {t1}, t2 = {t2}, t3 = {t3}")
    print(f"t2.between(t1, t3) -> {t2.between(t1, t3)}")  # True:01:04:16 ∈ [01:03:30, 03:04:26)
    print(f"t1.between(t2, t3) -> {t1.between(t2, t3)}")  # False:01:03:30 < 01:04:16 → 不满足 t2 <= t1
    print(f"t3.between(t1, t2) -> {t3.between(t1, t2)}")  # False:03:04:26 >= 01:04:16 → 不满足 t3 < t2

输出

t1 = 01:03:30, t2 = 01:04:16, t3 = 03:04:26
t2.between(t1, t3) -> True
t1.between(t2, t3) -> False
t3.between(t1, t2) -> False

⚠️ 关键注意事项总结

  • 不要手动比较 hrs/mins/secs 字段:你已实现 __lt__ 和 __eq__,务必复用它们。仅比小时(如原代码 t1.hours
  • 方法定义位置至关重要:between 必须缩进在 class MyTime: 内部,成为类的成员方法;若写在类外,则是独立函数,无法通过 obj.between(...) 调用。
  • 参数命名体现语义:使用 start/end 比 t1/t2 更清晰,避免与实例自身混淆。
  • 边界条件已由 __le__ 和 __lt__ 保证:between 方法本身无需处理

通过本次重构,你不仅修复了语法错误,更践行了面向对象设计的核心原则:数据与操作数据的方法封装在一起,复用已有能力,提升代码健壮性与可维护性

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
java基础知识汇总
java基础知识汇总

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

1553

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

237

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

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

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

57

2025.09.05

java面向对象
java面向对象

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

60

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

624

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

21

2025.12.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

315

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

126

2026.02.13

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

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