之前的博客中 , 介绍了 类中的 __init__()
类内置构造方法 , 此外还有其它的类 内置方法 , 这些内置方法都有特殊的功能 ;
Python 中 将 这些类内置方法 称为 " 魔术方法 " ;
魔术方法 在对象被使用时会自动调用 , 常见的 魔术方法如下 :
__init__(self, ...)
: 构造方法 , 创建类 实例对象时 , 自动调用 , 常用于为成员变量赋值 ;__str__(self)
: 相当于 Java 中的 toString 方法 ;__lt__(self, other)
: 小于比较操作 , 返回一个布尔值 ;__le__(self, other)
: 小于等于比较操作 , 返回一个布尔值 ;__eq__(self, other)
: 等于比较操作 , 返回一个布尔值 ;Python 中为类定义了 几十个 魔术方法 , 本博客中介绍下 魔术方法 概念 , 以及常用的魔术方法 ;
魔术方法有个特点 , 就是 前后都有两个下划线 __xx__
;
在 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
实现 __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
创建同一个类的 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
__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
__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