Python中的重载

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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值