【发布时间】: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 中,装饰器(或包装器)的概念完全不同。在您的示例中,您不使用装饰器。