【发布时间】:2013-04-23 13:44:57
【问题描述】:
对于我目前正在工作的项目之一,我正在考虑创建一个无法由客户端实例化并且只能通过特定接口提供实例的类,即客户端将无法创建更多实例它是由一些黑客攻击的,例如:
>>> try:
... raise WindowsError
... except:
... foo = sys.exc_info()
...
>>> foo
(<type 'exceptions.WindowsError'>, WindowsError(), <traceback object at 0x0000000005503A48>)
>>> type(foo[2])()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'traceback' instances
一旦他有了。
我成功地创建了一个无法实例化的类。即
>>> class Foo():
... def __init__(self):
... raise TypeError("cannot create 'Foo' instances")
...
>>> bar = Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
TypeError: cannot create 'Foo' instances
>>> bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'bar' is not defined
但是我如何使用每个相同的定义来创建类的实例呢?
当然我可以这样做:
>>> class Foo():
... def __init__(self, instantiate = False):
... if not instantiate:
... raise TypeError("cannot create 'Foo' instances")
但我觉得它不够优雅,也没有完全阻止客户端进一步实例化它。不,我不会为它构建一个 C++ 模块。
关于如何实现这样的事情有什么建议吗? import abc?
回答 Martijn 的 question 的简要理由并为了完整起见:
实际上,您可以将所讨论的特定相关类的实例视为树中的节点,并且父级和子级都保持连接,相互依赖和认识,并具有唯一的唯一性贯穿任何 python 实例的根(通过使用package 来保证)。特定节点中的任何状态更改都会导致其他人相应地更新自己和他们所连接的数据库。除此之外,我很想知道如何实现这样的事情(traceback 类在取笑我)。
【问题讨论】:
-
在某些语言中,您创建了一个私有构造函数。我的 Python 技能为零,仅供参考。
-
为什么需要这个?为什么必须阻止创建实例?
-
@granadaCoder:纯 Python 中没有私有的东西,只有 C 定义的扩展类型才能隐藏东西。
-
哈!现在我知道关于python的一件事了!谢谢。
-
不用说,这是个糟糕的主意。
标签: python instantiation objectinstantiation