三大特征
多态
重写内置函数
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)
算数运算符
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)
复合运算符重载
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)
比较运算重载
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
- 在继承的基础上,体现类型的个性(一个行为有不同的实现)
- 增强程序灵活性
最后一次更新于2022-10-20 15:46
0 条评论