【Python】面向对象 ④ ( 魔术方法 - 类内置方法 | `__str__` 字符串魔术方法 | 小于符号比较魔术方法 | 实现 `__lt__` 小于符号比较方法后也可以进行大于比较 )

文章目录

  • 一、魔术方法 - 类内置方法
    • 1、魔术方法
  • 二、字符串方法
    • 1、直接打印实例对象 - 打印地址
    • 2、实现字符串方法
  • 三、小于符号比较方法
    • 1、实例对象之间直接进行小于比较会报错
    • 2、实现 `__lt__` 小于符号比较方法
    • 3、实现 `__lt__` 小于符号比较方法后也可以进行大于比较





一、魔术方法 - 类内置方法




1、魔术方法


之前的博客中 , 介绍了 类中的 __init__() 类内置构造方法 , 此外还有其它的类 内置方法 , 这些内置方法都有特殊的功能 ;

Python 中 将 这些类内置方法 称为 " 魔术方法 " ;


魔术方法 在对象被使用时会自动调用 , 常见的 魔术方法如下 :

  • __init__(self, ...) : 构造方法 , 创建类 实例对象时 , 自动调用 , 常用于为成员变量赋值 ;
  • __str__(self) : 相当于 Java 中的 toString 方法 ;
  • __lt__(self, other) : 小于比较操作 , 返回一个布尔值 ;
  • __le__(self, other) : 小于等于比较操作 , 返回一个布尔值 ;
  • __eq__(self, other) : 等于比较操作 , 返回一个布尔值 ;

Python 中为类定义了 几十个 魔术方法 , 本博客中介绍下 魔术方法 概念 , 以及常用的魔术方法 ;

魔术方法有个特点 , 就是 前后都有两个下划线 __xx__ ;





二、字符串方法




1、直接打印实例对象 - 打印地址


在 Python 中 , 直接打印 Python 类的 实例对象 , 打印出来的是 该 实例对象的地址 , 如 :

<__main__.Student object at 0x0000029E4C2401C0>

如下代码所示 :

"""
面向对象 代码示例
"""


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age


s = Student("Tom", 18)
print(f"{s}")

执行上述代码 , 得到的结果是

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
<__main__.Student object at 0x0000029E4C2401C0>

Process finished with exit code 0

【Python】面向对象 ④ ( 魔术方法 - 类内置方法 | `__str__` 字符串魔术方法 | 小于符号比较魔术方法 | 实现 `__lt__` 小于符号比较方法后也可以进行大于比较 )_第1张图片


2、实现字符串方法


实现 __str__(self) 方法 , 在其中返回字符串 ,

那么 打印 Student 实例对象时 , 打印的内容就是 __str__ 字符串方法的返回值内容 ;

代码示例 :

"""
面向对象 代码示例
"""


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name} is {self.age} years old"


s = Student("Tom", 18)
print(f"{s}")

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
Tom is 18 years old

Process finished with exit code 0

【Python】面向对象 ④ ( 魔术方法 - 类内置方法 | `__str__` 字符串魔术方法 | 小于符号比较魔术方法 | 实现 `__lt__` 小于符号比较方法后也可以进行大于比较 )_第2张图片





三、小于符号比较方法




1、实例对象之间直接进行小于比较会报错


创建同一个类的 2 个实例对象 , 对比 对象 A 是否小于 对象 B , 会直接报错 :

TypeError: '<' not supported between instances of 'Student' and 'Student'

这是因为该类 , 没有实现 __lt__ 小于符号比较方法 ;


代码示例如下 :

"""
面向对象 代码示例
"""


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age


s1 = Student("Tom", 18)
s2 = Student("Jerry", 12)
print(f"{s1 < s2}")

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
Traceback (most recent call last):
  File "D:\002_Project\011_Python\HelloPython\Hello.py", line 14, in <module>
    print(f"{s1 < s2}")
TypeError: '<' not supported between instances of 'Student' and 'Student'

Process finished with exit code 1

【Python】面向对象 ④ ( 魔术方法 - 类内置方法 | `__str__` 字符串魔术方法 | 小于符号比较魔术方法 | 实现 `__lt__` 小于符号比较方法后也可以进行大于比较 )_第3张图片


2、实现 __lt__ 小于符号比较方法


在类中 , 实现 __lt__ 小于符号比较方法 , 下面实际比较的是 age 字段 ;

    def __lt__(self, other):
        return self.age < other.age

代码示例 :

"""
面向对象 代码示例
"""


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        return self.age < other.age


s1 = Student("Tom", 18)
s2 = Student("Jerry", 12)
print(f"{s1 < s2}")

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
False

Process finished with exit code 0


3、实现 __lt__ 小于符号比较方法后也可以进行大于比较


下面的代码中 , 尝试加入 实例对象 的大于比较 , 发现 大于比较 也是可以进行的 ;

代码示例 :

"""
面向对象 代码示例
"""


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        return self.age < other.age


s1 = Student("Tom", 18)
s2 = Student("Jerry", 12)
print(f"{s1 < s2}")
print(f"{s1 > s2}")

执行结果 :

D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/HelloPython/Hello.py
False
True

Process finished with exit code 0

【Python】面向对象 ④ ( 魔术方法 - 类内置方法 | `__str__` 字符串魔术方法 | 小于符号比较魔术方法 | 实现 `__lt__` 小于符号比较方法后也可以进行大于比较 )_第4张图片

你可能感兴趣的:(Python,python,开发语言,面向对象,魔术方法)