【问题标题】:Wrapper class in Python [duplicate]Python中的包装类[重复]
【发布时间】:2013-02-08 04:47:13
【问题描述】:

我想要一个包装类,它的行为与它所包装的对象完全一样,只是它添加或覆盖了一些选择方法。

我的代码目前如下所示:

# Create a wrapper class that equips instances with specified functions
def equipWith(**methods):

  class Wrapper(object):
    def __init__(self, instance):
      object.__setattr__(self, 'instance',instance)

    def __setattr__(self, name, value):
      object.__setattr__(object.__getattribute__(self,'instance'), name, value)

    def __getattribute__(self, name):
      instance = object.__getattribute__(self, 'instance')

      # If this is a wrapped method, return a bound method
      if name in methods: return (lambda *args, **kargs: methods[name](self,*args,**kargs))

      # Otherwise, just return attribute of instance
      return instance.__getattribute__(name)

  return Wrapper

为了测试这一点,我写道:

class A(object):
  def __init__(self,a):
    self.a = a

a = A(10)
W = equipWith(__add__ = (lambda self, other: self.a + other.a))
b = W(a)
b.a = 12
print(a.a)
print(b.__add__(b))
print(b + b)

当在最后一行时,我的解释器抱怨:

Traceback (most recent call last):
  File "metax.py", line 39, in <module>
    print(b + b)
TypeError: unsupported operand type(s) for +: 'Wrapper' and 'Wrapper'

这是为什么?如何让我的包装类按照我想要的方式运行?

【问题讨论】:

标签: python wrapper


【解决方案1】:

看起来你想要的只能用非常措施的新型对象来完成。参见https://stackoverflow.com/a/9059858/380231this blog postdocumentation

基本上,“特殊”函数缩短了对新样式对象的查找过程。

【讨论】:

猜你喜欢
  • 2017-04-23
  • 2017-04-03
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2012-02-09
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多