在自定义Python类中覆盖默认方法的简单方法?
我有一个叫做 Cell 的类:
class Cell:
def __init__(self, value, color, size):
self._value = value
self._color = color
self._size = size
# and other methods...
Cell._value
会用来存储字符串、整数等等(就是我用这个对象时需要的东西)。我希望所有默认的方法在使用对象的“值”时,都能使用 <Cell object>._value
,这样我就可以这样做:
>>> c1 = Cell(7, "blue", (5,10))
>>> c2 = Cell(8, "red", (10, 12))
>>> print c1 + c2
15
>>> c3 = Cell(["ab", "cd"], "yellow", (50, 50))
>>> print len(c3), c3
2 ['ab', 'cd']
# etc.
我可以重写所有默认的方法:
class Cell:
def __init__(self, value, color, size):
# ...
def __repr__(self):
return repr(self._value)
def __str__(self):
return str(self._value)
def __getitem__(self, key):
return self._value[key]
def __len__(self):
return len(self._value)
# etc.
...但是有没有更简单的方法呢?
2 个回答
0
你需要重写 __add__
这个方法,才能让 c1 + c2
产生你想要的效果。
想了解更多关于这些方法的信息,可以查看 这里。
13
如果我理解得没错,你是在寻找一种简单的方法,把一个对象的方法委托给那个对象的某个属性吗?
你可以通过定义一个装饰器来减少一些重复的代码:
def delegate(method, prop):
def decorate(cls):
setattr(cls, method,
lambda self, *args, **kwargs:
getattr(getattr(self, prop), method)(*args, **kwargs))
return cls
return decorate
然后你可以把这个装饰器应用到你想要委托的方法上:
@delegate('__len__', '_content')
@delegate('__getitem__', '_content')
class MyList(object):
def __init__(self, content):
self._content = content
spam = MyList([1,2,3,4,5])
len(spam) # prints "5"
spam[0] # prints "1"
你可能还可以进一步简化,修改装饰器,让它可以接收多个方法名作为参数。
如果你想让你的类完全封装另一个对象,你可以重写这个类的 __getattr__
方法,在出错之前先检查一下被封装的对象。这样可以模拟子类的行为,而不需要真正的继承。