重载成员访问运算符

时间:2019-10-30 12:55:49

标签: python python-3.x operator-overloading

有没有一种方法可以重载python中的成员访问运算符?示例(由于可能是XY问题,我将提供一个包含我要执行的操作的示例):

class A:
    def __someOverload__(self, name, *args):
        if (name == "foo") print("HW!")
a = A()
a.foo()

>>> HW!

3 个答案:

答案 0 :(得分:2)

您可以尝试覆盖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)

答案 1 :(得分:0)

可以更改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。 希望这会有所帮助:)

答案 2 :(得分:0)

为此,我将使用setattr

>>> class A:
>>>   def __init__(self):
>>>     setattr(self, 'foo', lambda: print('foo'))
>>> 
>>> a = A()
>>> a.foo()
foo