【问题标题】:Python wrapper classPython 包装类
【发布时间】:2015-03-04 16:44:19
【问题描述】:

我已经接触 python 大约 2 年了,直到今天我看到这样的东西时,我才使用或遇到过包装类:

class Wrapper(object):
  def list_to_str(self, my_list):
    if self.mode == 'convert':
      return str(my_list)

  def get_tree(self, my_list)
      my_tree = self.list_to_tree(my_tree)
     return my_tree

class RealClass(Wrapper):

  def __init__(self, mode):
    self.mode = mode
  
  def list_to_tree(self, list):
       ""convert list to tree""
       return tree

我对这段代码非常恼火,我个人觉得它真的很难看。

但是,由于我没有在生产环境(或任何其他环境)中接触过包装类,我不确定是否找到了上述做法。

请告诉我 ^ 是否可以,如果不行,请告诉我应该如何重新分解这 2 个类(完全删除包装器?)或提供一些资源。

到目前为止,我查看了 python 文档和一些与包装类相关的其他帖子,但似乎所有的 _ getattribute _ 和类似的东西在这里并不适用。

【问题讨论】:

  • 这是基本的类继承。您应该阅读object-oriented programming 以了解发生了什么。此外,为了提供抽象实现,这样的事情很常见,并且可以很好地利用 python 的动态特性。
  • @HolgerJust 我理解为什么这个包装类可以工作以及类似的东西,但我不知道是否可以,比如说,在包装中没有 init
  • 为什么 Wrapper 需要一个 init?你有实例化过 Wrapper 吗?
  • 您可能会感到困惑的是,在您的情况下,名为 Wrapper 的类并不是一个实际的包装器。它是RealClass 的父类。这样,您可能只创建了 RealClass 实例,这些实例从 Wrapper 类继承了它们的一些行为。
  • 在 Python 中,装饰器(或包装器)的概念完全不同。在您的示例中,您不使用装饰器。

标签: python code-conversion


【解决方案1】:

问题是您的示例根本不是包装类。它既可以被视为一个抽象基类,也可以被视为一个混合体。在任何一种情况下,想法都是有一个实现某些功能但不打算独立存在的类。这些类型的类通常会跳过初始化并假设真正的实现类正确设置了对象。

通常,类不需要__init__,但它对于设置实例变量非常有用,因此大多数类都有它们。

在您的情况下,错误命名的 Wrapper 假定实现者将定义 self.modeself.list_to_tree。如果该合同得到满足,它会为您执行list_to_strget_tree。可能有多个实现者对 modelist_to_tree 有不同的看法,但他们都会从基类中获得相同的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2016-06-29
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多