三大特征

多态

重写内置函数

Python中,以双下划线开头、双下划线结尾的是系统定义的成员。我们可以在自定义类中进 行重写,从而改变其行为

  • str : 对象转换为字符串
class Person:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age
    def __str__(self):
         return f"{self.name}的年龄是{self.age}"

wk = Person("悟空", 26)
# <__main__.Person object at 0x7fbabfbc3e48>
# 悟空的年龄是26
print(wk)
# message = wk.__str__()
# print(message)

算数运算符

QQ截图20221020154135.jpg

class Vector2:
    """
        二维向量
    """

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return "x是:%d,y是:%d" % (self.x, self.y)

    def __add__(self, other):
        return Vector2(self.x + other.x, self.y + other.y)

v01 = Vector2(1, 2)
v02 = Vector2(2, 3)
print(v01 + v02) # v01.__add__(v02)

复合运算符重载

QQ截图20221020154234.jpg

class Vector2:
    """
        二维向量
    """

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return "x是:%d,y是:%d" % (self.x, self.y)

    # + 创建新
    def __add__(self, other):
        return Vector2(self.x + other.x, self.y + other.y)

    # += 在原有基础上修改(自定义类属于可变对象)
    def __iadd__(self, other):
        self.x += other.x
        self.y += other.y
        return self

v01 = Vector2(1, 2)
v02 = Vector2(2, 3)
print(id(v01))
v01 += v02
print(id(v01))
print(v01)

比较运算重载

QQ截图20221020154422.jpg

class Vector2:
    """
        二维向量
    """
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # 决定相同的依据
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    # 决定大小的依据
    def __lt__(self, other):
        return self.x < other.x

v01 = Vector2(1, 1)
v02 = Vector2(1, 1)
print(v01 == v02) # True 比较两个对象内容(__eq__决定)
print(v01 is v02) # False 比较两个对象地址

list01 = [
    Vector2(2, 2),
    Vector2(5, 5),
    Vector2(3, 3),
    Vector2(1, 1),
    Vector2(1, 1),
    Vector2(4, 4),
]

# 必须重写 eq
print(Vector2(5, 5) in list01)
print(list01.count(Vector2(1, 1)))

# 必须重写 lt
list01.sort()
print(list01)

__add____iadd__的区别

查看源码可以发现两个方法返回结果的区别

  • 可变变量在执行+时会调用__add__方法,并返回新的对象
  • 可变变量在执行+=时会调用__iadd__方法,修改原有的对象后返回
class list(object):
    # ...

    def __add__(self, *args, **kwargs): # real signature unknown
        """ Return self+value. """
        pass

    # ...

    def __iadd__(self, *args, **kwargs): # real signature unknown
        """ Implement self+=value. """
        pass

    # ...
  • 不可变变量在执行+时会调用__add__方法,并返回新的对象
  • 不可变变量在执行+=时,由于没有__iadd__方法,所以会调用__add__方法,并返回新的对象
class tuple(object):
    # ...

    def __add__(self, *args, **kwargs): # real signature unknown
        """ Return self+value. """
        pass

    # ...

重写自定义函数

子类实现了父类中相同的方法(方法名、参数),在调用该方法时,实际执行的是子类的方法

  • 快捷键:ctrl + O
  • 在继承的基础上,体现类型的个性(一个行为有不同的实现)
  • 增强程序灵活性