考虑以下类别:
class ClusterAssignment(object):
def __init__(self, id, cluster):
self.id = long(id)
self.cluster = long(cluster)
@property
def id(self):
return self._java_model.id()
@property
def cluster(self):
return self._java_model.cluster()
def __str__(self):
return self._str()
def _str(self):
return "(%d,%d)" %(self.id(), self.cluster())
def __repr__(self):
return self._str()
试图重写str和repr是不正确的:它们是未使用的。
^{pr2}$现在有一个现有的SOF名义上解决了这个问题:
Overriding special methods on an instance
然而,如何应用上述案例中提供的解决方案尚不清楚。
具体来说:当调用str或repr时,如何配置自定义的_str()来调用?
UPDATE我在简化SOF中的strvs\u str()方法时犯了一个错误。同样的结果发生在更正的代码上-上面更新了。
我认为您在自己的代码中实现变通方法时犯了几个错误,而您真正想要的是这样的
因此每当调用}时,它们都返回{}的结果
__str__()
或{我可以想出四种方法来产生“相同”}方法。。。不算复制和粘贴之类的错误。在
__str__
和{(对于这些示例,我使用的是一个精简的
ClusterAssignment
类,它没有任何意义的字符串表示形式,没有其他方法。)您可以使用Tim Castelijns的方法和一个单独的“private”}调用:
_str
方法,该方法由__str__
和{这是可行的,但需要在这两个函数的主体中重复自己。在
为了避免重复,可以正常编写}中的一个,然后让另一个方法只调用“real”方法。您编写的“真正的”方法取决于您的预期输出-它是更“stringy”还是“repr-y”?在
__str__
或{“调用‘real’方法有两种方法:使用dunder方法(下面的第一个示例)或使用公共接口(第二个示例)。我建议使用公共界面,因为这是你的用户必须做的。在
^{pr2}$最后,您可以给一个“real”方法一个别名:
这里没有重复,也没有多余的方法定义:
__repr__
是__str__
。在我认为这是显式的(比隐式的好)——只执行一个任务,所以只有一个方法。其他人可能会认为这是相反的-现在有两个名字伪装成两个方法,而实际上只有一个。而且,它们在源代码中的顺序现在很重要-
__repr__
必须在__str__
之后定义。在别名技术的一个怪癖是:方法本身的字符串表示现在也完全相同了。前三个版本产生:
别名版本清楚地表明只有一种方法:
…或者它会让你的同事去寻找在应该调用
__repr__
时调用__str__
的窃听上线。在什么样的项目指南是这种风格的决定。在
相关问题 更多 >
编程相关推荐