重写自定义 Python 类中的默认方法的简单方法?
我有一个名为 Cell 的类:
class Cell:
def __init__(self, value, color, size):
self._value = value
self._color = color
self._size = size
# and other methods...
Cell._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.
...但是有更简单的方法吗?
I have a class called Cell:
class Cell:
def __init__(self, value, color, size):
self._value = value
self._color = color
self._size = size
# and other methods...
Cell._value
will store a string, integer, etc. (whatever I am using that object for). I want all default methods that would normally use the "value" of an object to use <Cell object>._value
so that I can do:
>>> 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.
I could override all the default methods:
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.
...but is there an easier way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果我理解正确,您正在寻找一种简单的方法将对象的方法委托给该对象的属性?
您可以通过定义装饰器来避免一些重复性:
然后您可以为要委托的每个方法应用装饰器:
您可以通过修改装饰器以将多个方法名称作为参数来进一步简化它。
如果您希望您的类充当完整的包装器,您可能可以重写该类的 __getattr__ 方法以在失败之前检查包装的对象。这将在没有实际继承的情况下模拟子类的行为。
If I understand you correctly, you're looking for an easy way to delegate an object's method to a property of that object?
You can avoid some of the repetitiveness by defining a decorator:
You can then apply the decorator for each method you want delegated:
You could probably simplify it further by modifying the decorator to take multiple method names as argument.
If you want your class to act as a full wrapper, you could probably override the class's
__getattr__
method to check the wrapped object before failing. That would emulate the behaviour of subclasses without actual inheritance.您需要重载 __add__ 方法才能获得您想要的 c1 + c2 行为。
有关它们的详细信息,请参阅此处。
You need to overload the
__add__
method in order to get thec1 + c2
behavior you want.See here for info on what they all are.