【问题标题】:Overload member access operator重载成员访问运算符
【发布时间】:2019-10-30 12:55:49
【问题描述】:
有没有办法在 python 中重载成员访问运算符?示例(因为它可能是一个 XY 问题,我将提供一个包含我想做的示例):
class A:
def __someOverload__(self, name, *args):
if (name == "foo") print("HW!")
a = A()
a.foo()
>>> HW!
【问题讨论】:
标签:
python
python-3.x
operator-overloading
【解决方案1】:
您可以尝试覆盖 getattr:
class A:
def __getattr__(self, name):
if name == "foo":
return lambda: print("hi")
>>> a = A()
>>> a.foo()
hi
一个更复杂的例子:
class A:
def __getattr__(self, name):
if name == "foo":
return lambda *args: print(args)
>>> a = A()
>>> a.foo(1, 2, 3)
(1, 2, 3)
【解决方案2】:
可以更改 Python 内置函数的默认行为。我们只需要在我们的类中定义相应的特殊方法即可。
class Purchase:
def __init__(self, basket, buyer):
self.basket = list(basket)
self.buyer = buyer
def __len__(self):
return len(self.basket)
purchase = Purchase(['pen', 'book', 'pencil'], 'Python')
print(len(purchase))
这里的输出是 3。
希望这可能会有所帮助:)
【解决方案3】:
我会为此使用setattr:
>>> class A:
>>> def __init__(self):
>>> setattr(self, 'foo', lambda: print('foo'))
>>>
>>> a = A()
>>> a.foo()
foo