加入收藏 | 设为首页 | 会员中心 | 我要投稿 大庆站长网 (https://www.0459zz.com/)- 科技、智能边缘云、事件网格、云计算、站长网!
当前位置: 首页 > 编程开发 > Python > 正文

用于__str__和方法解析顺序的Python Mixin

发布时间:2021-03-30 12:03:07 所属栏目:Python 来源:互联网
导读:我发现我用 Python编写的许多类包含一小部分变量,我实际上希望在调用str()时看到这些变量,并且为每个变量重写__str __(self)是相当麻烦的.因此,我煮了下面的mixin, class StrMixin(object): Automatically generate __str__ and __repr__ def __str__(self):

我发现我用 Python编写的许多类包含一小部分变量,我实际上希望在调用str()时看到这些变量,并且为每个变量重写__str __(self)是相当麻烦的.因此,我煮了下面的mixin,

class StrMixin(object):
  '''
  Automatically generate __str__ and __repr__
  '''
  def __str__(self):
    import types
    name = self.__class__.__name__ + ': '
    attrs = [ '{}={}'.format(k,v) for (k,v) in self.__dict__.items() ]
    return name + ','.join(attrs)

  def __repr__(self):
    return str(self)

但是,如果我写一堂课,

class C(object,StrMixin):
    pass

我在实例化时收到以下错误,

TypeError: Error when calling the metaclass bases
    Cannot create a consistent method resolution
order (MRO) for bases object,StrMixin

当然,包括这里的对象是多余的,但这里到底发生了什么?

解决方法

当你定义:
class StrMixin(object):
  ...

编译器知道StrMixin位于类的MRO中的对象之前.

当你这样做时:

class C(object,StrMixin):
    pass

您告诉编译器该对象在MRO中的StrMixin之前出现.但是对象也必须在StrMixin之后,所以它必须在MRO中出现两次,这是不允许的.

如果你说:

class C(StrMixin,object):
    pass

那么MRO就是C,StrMixin,它满足两个类所强加的排序.没有重复,因为尽管对象被引用两次,但定义之间没有冲突.

(编辑:大庆站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读