【发布时间】:2017-07-28 15:32:16
【问题描述】:
如果我想改变继承方法的行为,我会这样做:
class a:
def changeMe(self):
print('called a')
class b(a):
def changeMe(self):
print('called b')
我相信这是 Python 中覆盖的一个例子。
但是,如果我想重载一个运算符,我会做一些非常相似的事情:
class c:
aNumber = 0
def __add__(self, operand):
print("words")
return self.aNumber + operand.aNumber
a = c()
b = c()
a.aNumber += 1
b.aNumber += 2
print(a + b) # prints "words\n3"
我想也许操作符方法在 python 中真的被重写了,因为我们重载了using optional parameters,我们只是把它称为操作符重载。
但它也不能被覆盖,因为'__add__' in object.__dict__.keys() 是False;方法必须是父类的成员才能被覆盖(所有类在创建时都继承自 object)。
我的理解差距在哪里?
【问题讨论】:
-
我相信覆盖通常是指采用已经存在的方法并覆盖它以用于您的特定实现。运算符重载通常采用语言中的运算符,即“+”,并为通常没有内置操作的对象定义它们。例如,如果我创建一个名为“item”的类,它有一个价格和一个描述,我可以使用运算符重载来定义 item1 + item2 的作用,这可以说...返回组合价格。
-
请在 changeme 函数签名中使用 self。 a类:def changeme(self):print('称为a')b类(a):def changeme(self):print('称为b')
标签: python python-3.x oop operator-overloading overriding