python – 如何正确实现__str__和__repr__

python – 如何正确实现__str__和__repr__,第1张

概述在我的几个类中,我想实现__str__和__repr__,并且通常最终得到如下代码: class MyClass(object): def __init__(self, a): self.a = a def __str__(self): return 'MyClass({})'.format(self.a) def __repr__(se 在我的几个类中,我想实现__str__和__repr__,并且通常最终得到如下代码:

class MyClass(object):    def __init__(self,a):        self.a = a    def __str__(self):        return 'MyClass({})'.format(self.a)    def __repr__(self):        return 'MyClass({!r})'.format(self.a)

这符合我的期望:

>>> myobject = MyClass(np.array([1,2]))>>> str(myobject)'MyClass([1 2])'>>> repr(myobject)'MyClass(array([1,2]))'

然而,代码违反DRY并且随着参数的数量开始增长而保持这变得很麻烦,我经常发现__str__或__repr__中的任何一个与另一个“不同步”.

有没有更好的方法同时实现__str__和__repr__而不重复?

解决方法 由于__str __和__repr__遵循相同的模式,因此您可以编写一个函数来为您创建对象的字符串表示形式.它需要一个对象,一个属性列表和str或repr作为参数:

def stringify(obj,attrs,strfunc):    values = []    # get each attribute's value and convert it to a string    for attr in attrs:        value = getattr(obj,attr)        values.append(strfunc(value))    # get the class name    clsname = type(obj).__name__    # put everything together    args = ','.join(values)    return '{}({})'.format(clsname,args)print( stringify(MyClass('foo'),['a'],repr) )# output: MyClass('foo')

我建议将此函数放在一个继承自的类中:

class Printable:    def __str__(self):        return self.__stringify(str)    def __repr__(self):        return self.__stringify(repr)    def __stringify(self,strfunc):        values = []        for attr in self._attributes:            value = getattr(self,attr)            values.append(strfunc(value))        clsname = type(self).__name__        args = ','.join(values)        return '{}({})'.format(clsname,args)class MyClass(Printable):    _attributes = ['a']    def __init__(self,a):        self.a = a

您甚至可以通过直接从__init__函数的签名中获取属性来完全自动完成它:

import inspectclass Autoprintable:    def __str__(self):        return self.__stringify(str)    def __repr__(self):        return self.__stringify(repr)    def __stringify(self,strfunc):        sig= inspect.signature(self.__init__)        values= []        for attr in sig.parameters:            value= getattr(self,attr)            values.append(strfunc(value))        clsname= type(self).__name__        args= ',args)class MyClass(Autoprintable):    def __init__(self,a,b):        self.a = a        self.b = bprint( str(MyClass('foo','bar')) ) # output: MyClass(foo,bar)print( repr(MyClass('foo','bar')) ) # output: MyClass('foo','bar')
总结

以上是内存溢出为你收集整理的python – 如何正确实现__str__和__repr__全部内容,希望文章能够帮你解决python – 如何正确实现__str__和__repr__所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1193984.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存