在自定义python类上转换自定义的

2024-10-01 00:29:27 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下类别:

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()

试图重写strrepr是不正确的:它们是未使用的。

^{pr2}$

现在有一个现有的SOF名义上解决了这个问题:

Overriding special methods on an instance

然而,如何应用上述案例中提供的解决方案尚不清楚。

具体来说:当调用strrepr时,如何配置自定义的_str()来调用?

UPDATE我在简化SOF中的strvs\u str()方法时犯了一个错误。同样的结果发生在更正的代码上-上面更新了。


Tags: selfidmodelreturndefpropertyjava类别
2条回答

我认为您在自己的代码中实现变通方法时犯了几个错误,而您真正想要的是这样的

def __str__(self):
    return self._str()

def __repr__(self):
    return self._str()

def _str(self):
    return "(%d,%d)" %(self.id(), self.cluster())

因此每当调用__str__()或{}时,它们都返回{}的结果

我可以想出四种方法来产生“相同”__str__和{}方法。。。不算复制和粘贴之类的错误。在

(对于这些示例,我使用的是一个精简的ClusterAssignment类,它没有任何意义的字符串表示形式,没有其他方法。)

您可以使用Tim Castelijns的方法和一个单独的“private”_str方法,该方法由__str__和{}调用:

class ClusterAssignment(object):

    def _str(self):
        return "[string]"

    def __str__(self):
        return self._str()

    def __repr__(self):
        return self._str()

这是可行的,但需要在这两个函数的主体中重复自己。在

为了避免重复,可以正常编写__str__或{}中的一个,然后让另一个方法只调用“real”方法。您编写的“真正的”方法取决于您的预期输出-它是更“stringy”还是“repr-y”?在

“调用‘real’方法有两种方法:使用dunder方法(下面的第一个示例)或使用公共接口(第二个示例)。我建议使用公共界面,因为这是你的用户必须做的。在

^{pr2}$

最后,您可以给一个“real”方法一个别名:

class ClusterAssignment(object):

    def __str__(self):
        return "[string]"

    __repr__ = __str__

这里没有重复,也没有多余的方法定义:__repr____str__。在

我认为这是显式的(比隐式的好)——只执行一个任务,所以只有一个方法。其他人可能会认为这是相反的-现在有两个名字伪装成两个方法,而实际上只有一个。而且,它们在源代码中的顺序现在很重要-__repr__必须在__str__之后定义。在

别名技术的一个怪癖是:方法本身的字符串表示现在也完全相同了。前三个版本产生:

>>> ca = ClusterAssignment()
>>> print(ca.__str__)
<bound method ClusterAssignment.__str__ of [string]>
>>> print(ca.__repr__)
<bound method ClusterAssignment.__repr__ of [string]>

别名版本清楚地表明只有一种方法:

>>> ca = ClusterAssignment()
>>> print(ca.__str__)
<bound method ClusterAssignment.__str__ of [string]>
>>> print(ca.__repr__)
<bound method ClusterAssignment.__str__ of [string]>

…或者它会让你的同事去寻找在应该调用__repr__时调用__str__的窃听上线。在

什么样的项目指南是这种风格的决定。在

相关问题 更多 >