加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 酸洗类方法

发布时间:2020-12-20 11:23:58 所属栏目:Python 来源:网络整理
导读:我有一个类,其实例需要按照用户的指示格式化输出.有一种默认格式,可以覆盖.我这样实现了: class A: def __init__(self,params): # ... # by default printing all float values as percentages with 2 decimals self.format_functions = {float: lambda x :
我有一个类,其实例需要按照用户的指示格式化输出.有一种默认格式,可以覆盖.我这样实现了:

class A:
  def __init__(self,params):
    # ...
    # by default printing all float values as percentages with 2 decimals
    self.format_functions = {float: lambda x : '{:.2%}'.format(x)}
  def __str__(self):
    # uses self.format_functions to format output
    # ...

a = A(params)
print(a) # uses default output formatting

# overriding default output formatting
# float printed as percentages 3 decimal digits; bool printed as Y / N
a.format_functions = {float : lambda x: '{:.3%}'.format(x),bool : lambda x: 'Y' if x else 'N'}
print(a)

好吗?让我知道是否有更好的方法来设计它.

不幸的是,我需要挑选这个类的实例.但是只能在模块顶层定义的函数进行酸洗; lambda函数是不可取消的,所以我的format_functions实例属性打破了酸洗.

我尝试重写这个以使用类方法而不是lambda函数,但由于同样的原因仍然没有运气:

class A:
  @classmethod
  def default_float_format(cls,x):
    return '{:.2%}'.format(x)
  def __init__(self,params):
    # ...
    # by default printing all float values as percentages with 2 decimals
    self.format_functions = {float: self.default_float_format}
  def __str__(self):
    # uses self.format_functions to format output
    # ...

a = A(params)
pickle.dump(a) # Can't pickle <class 'method'>: attribute lookup builtins.method failed

请注意,即使我没有覆盖默认值,这里的酸洗也不起作用;只是我指定self.format_functions = {float:self.default_float_format}的事实打破了它.

该怎么办?我宁愿不污染命名空间并通过在模块级别定义default_float_format来破坏封装.

顺便说一下,为什么世界上泡菜会产生这种限制?对于最终用户来说,这无疑是一种无端和实质性的痛苦.

解决方法

对于类实例或函数(以及方法)的pickle,Python的pickle取决于它们的名称可用作全局变量 – 字典中对方法的引用指向全局名称空间中不可用的名称 – 这是更好的说“模块命名空间” –

您可以通过自定义类的酸洗来创建teh“__setstate__”和“__getstate__”方法 – 但我认为您会更好,因为格式化函数不依赖于对象或类本身的任何信息(即使某些格式化函数有效,也可以将其作为参数传递,并在类范围之外定义一个函数.

这确实有效(Python 3.2):

def default_float_format( x):
    return '{:.2%}'.format(x)

class A:

  def __init__(self,params):
    # ...
    # by default printing all float values as percentages with 2 decimals
    self.format_functions = {float: default_float_format}
  def __str__(self):
    # uses self.format_functions to format output
    pass

a = A(1)
pickle.dumps(a)

(编辑:李大同)

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

    推荐文章
      热点阅读