【问题标题】: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
      

      【讨论】:

        猜你喜欢
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多