1. 方法重载
在一个类里面. 方法名字相同, 而参数不同, 返回类型呢? 可以相同也可以不同, 重载是让类以统一的方式处理不同类型数据的一种手段
class Spam:
def bar(self, x:int, y:int, z:int):
print(x, y, z)
def bar(self, s:str, n:str, m: str):
print(s, n, m)
s = Spam()
s.bar(2, 3, 4)
s.bar('hello', 'lao', 'wang')
尽管Python可以实现方法重载, 但是很显然对于Python这种动态语言, 是多余的, 会限制了Python的灵活性, 这里只是介绍名词意义.
2. 运算符重载
- Python提供了运算符重载功能, 增强了语言的灵活性
- Python提供了很多魔法方法, 运算符重载就是通过重写这些内置魔法方法实现的, 都是’__'开头的
- Python通过这种特殊的命名方式来拦截操作符, 以实现重载
- 当Python的内置操作运用于类对象时, Python会搜索调用对象中的指定方法完成操作
- 运算符重载使我们的对象的行为与内置对象的一样, Python在调用操作符时会自动调用这样的方法
- 比如类实现了__add__方法, 当类的对象出现在’+'运算符中, 会调用这个方法
class Add:
def __init__(self, num):
self.num = num
def __add__(self, other):
return self.num + other
def __sub__(self, other):
return self.num - other
a = Add(10)
print(a + 10)
print(a - 5)
print(), str() 会优先调用__str__, 如果没有__str__, 全会调用__repr__
class Str(object):
def __str__(self):
return "__str__ called"
def __repr__(self):
return "__repr__ called"
s = Str()
print(s)
print(repr(s))
print(str(s))
# __str__ called
# __repr__ called
# __str__ called
class Str(object):
# def __str__(self):
# return "__str__ called"
def __repr__(self):
return "__repr__ called"
s = Str()
print(s)
print(repr(s))
print(str(s))
# __repr__ called
# __repr__ called
# __repr__ called
class Indexer:
data = [1,2,3,4,5,6]
def __getitem__(self,index):
return self.data[index]
def __setitem__(self,k,v):
self.data[k] = v
print(self.data)
i = Indexer()
print(i[0])
print(i[0:1])
print(i[0::2])
print(i[::-1])
# 1
# [1]
# [1, 3, 5]
# [6, 5, 4, 3, 2, 1]
- __getattr__在访问对象中不存在的成员时会自动调用
- 当__init__被调用的时候, 赋值运算也会调用__setattr__方法
class A():
def __init__(self, ax, bx):
self.a = ax
self.b = bx
def f(self):
print(self.__dict__)
def __getattr__(self, name):
print("__getattr__")
def __setattr__(self, name, value):
print("__setattr__")
self.__dict__[name] = value
a = A(1, 2)
a.f()
a.x
a.x = 3
a.f()