重载 Python 运算符

Python 面向对象编程进阶

Jake Roach

Data Engineer

重载比较运算符

class Person:
  def __init__(self, name):
      self.name = name

  def __eq__(self, other):
      return self.name == other.name

自定义 == 的功能

  • 使用 __eq__() 魔术方法
  • 接收 selfother
  • 返回布尔值
bryce = Person("Bryce")
orion = Person("Orion")
print(bryce == orion)
False
chuck = Person("Charles Carmichael")
charles = Person("Charles Carmichael")
print(chuck == charles)
True
Python 面向对象编程进阶

相加两个对象

class Team:
  def __init__(self, team_members):
      self.team_members = team_members

# 创建两个 Team 对象,并尝试相加
rookies = Team(["Casey", "Emmitt"])
veterans = Team(["Mike", "Chuck"])
dream_team = rookies + veterans
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
TypeError: unsupported operand type(s) for +: 'Team' and 'Team'
Python 面向对象编程进阶

重载 + 运算符

class Team:
  def __init__(self, team_members):
    # team_members 是姓名列表
    self.team_members = team_members

  def __add__(self, other):
    # 相加 Team 对象会得到更大的 Team
    return Team(self.team_members + other.team_members)
  • 使用 __add__() 魔术方法重载 +
  • selfother 会传入 __add__()
  • 使用被"相加"对象的 team_members 创建新的 Team
Python 面向对象编程进阶

相加两个对象

# 创建两个 Team 对象
rookies = Team(["Casey", "Emmitt"])
veterans = Team(["Mike", "Chuck"])

# 尝试将两个 Team 相加
dream_team = rookies + veterans
print(type(dream_team))
print(dream_team.team_members)
Team
["Casey", "Emmitt", "Mike", "Chuck"]
Python 面向对象编程进阶

+ 用于创建新类型对象

class Team:
  def __init__(self, team_members):
      self.team_members = team_members

class Employee:
  def __init__(self, name, title):
    self.name = name
    self.title = title

  def __add__(self, other):
    # 使用 + 运算符创建包含两位员工姓名的 Team
    return Team([self.name, other.name])

如果想通过合并 Employee 对象来创建一个 Team 呢?

  • Employee 类中实现 __add__
  • 通过收集 Employee 的姓名创建一个新的 Team
  • 两个 Employee 相加的结果是一个 Team
Python 面向对象编程进阶

相加两个对象以创建新对象

# 创建两个 Employee 对象
anna = Employee("Anna", "Technical Specialist")
jeff = Employee("Jeffrey", "Musician")

# 相加以创建一个团队
audio_team = anna + jeff
print(type(audio_team))
print(audio_team.team_members)
Team
["Anna", "Jeffrey"]
Python 面向对象编程进阶

重载其他运算符

运算符 魔术方法 运算符类型
- __sub__ 算术
!= __ne__ 比较
< __lt__ 比较
> __gt__ 比较
+= __iadd__ 赋值
and __and__ 逻辑
in __contains__ 成员
is __is__ 身份

 

 

 

 

 

 

 

……还有很多!

Python 面向对象编程进阶

Passons à la pratique !

Python 面向对象编程进阶

Preparing Video For Download...