Python 如何创建唯一的对象?
我想要 用什么代替Python 如何创建唯一的对象?,python,cons,Python,Cons,我想要 用什么代替?来确保断言不会失败 (有了Lisp,我可以用(cons nil nil)创建\u我的_unique,并在断言中使用eq) 注:用例:我将把\u my_unique放在dict中,因此我希望它与自身相等,但我不希望它(在dict冲突意义上)与从外部传入的任何内容相等。您可以使用对象(),但这不会使断言“永不失败”。如果调用myFunc并将MyClass.my_unique作为对象传递,则仍然会失败。另外,如果要测试它是否是同一个对象,请使用arg不是唯一的,而不是=您可以使用
?
来确保断言不会失败
(有了Lisp,我可以用(cons nil nil)
创建\u我的_unique
,并在断言中使用eq
)
注:用例:我将把\u my_unique
放在dict
中,因此我希望它与自身相等,但我不希望它(在dict
冲突意义上)与从外部传入的任何内容相等。您可以使用对象()
,但这不会使断言“永不失败”。如果调用myFunc
并将MyClass.my_unique
作为对象传递,则仍然会失败。另外,如果要测试它是否是同一个对象,请使用arg不是唯一的,而不是=代码>您可以使用
返回一个新的无特征对象<代码>对象
是所有新样式的基础
上课。它具有所有新实例通用的方法
样式类
如果您要问的是“如何使MyClass的每个实例的_my_唯一”,那么您只需在构造函数中创建一个新的空对象即可
例如:
class MyClass(object):
_my_unique = ???? # if this were lisp, I would have written (cons nil nil) here
def myFunc (self, arg):
assert arg != _my_unique # this must never fail
...
这是一个稍微令人困惑的问题,因为它似乎毫无目的地混合了一堆概念。首先,Python中的大多数对象都是唯一的,但可能有多种方法可以访问它们。检查身份的操作员不是=代码>(不平等)但不是
。与Java不同,Python不要求您将内容放入类中,也不隐式地查看self
(他们称之为隐式this
)cons
用于构造经常形成单链表的对,这种结构在Python中很少见,因为我们使用称为列表的动态引用数组。列表是可变的,因此使用list()
或[]
构建一个列表将生成一个唯一的对象
因此,尽管这是毫无意义的,但编写一个函数来生成执行无用断言的函数的一种方法可能是:
>>> class MyClass(object):
... def __init__(self):
... self.__my_unique = object()
...
>>> foo=MyClass()
>>> foo.__my_unique
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute '__my_unique'
每次调用createfunc()
都会返回一个新函数及其自己的mylist
。但是,对象的独特性并不意味着它无法到达:
def createfunc():
mylist=[]
def subfunc(x):
assert x is not mylist
return subfunc
关于PS,要与dict
冲突相关,您的对象也必须是,这使得object()
对于唯一对象来说比list()
更好的选择 您想设置对象的属性吗?我想一定有一些额外的条件您没有指定,否则任何不等于自身的东西--float(nan)
,例如--就足够了。我对用例感到困惑。为什么要包含一个永远不会失败的断言?那不是一行毫无意义的代码吗?只要删除断言
,它就不会失败,保证!:)@AdamSmith:大多数人只是断言“永远不会失败”。毕竟,如果您期望它失败,那么您可以编写代码来处理失败。断言会在依赖于值的代码运行之前让您知道它是否失败。@BryanOakley是的,但问题的措辞让人觉得他想要一个永远不会失败的选项,因为宇宙法则保证了它,比如assert 1<2
。如果这个断言失败了,你是对的,我想早点知道如何确保外部世界看不到MyClass.my_unique
?我在assert
中的测试必须与dict
使用的测试相同,请参阅PS@sds你不能。您可以礼貌地要求不要在前面加下划线,但您不能将任何内容设置为私有。这是:它可以解决python的问题,也就是说,它不是一种经过安全验证的语言。那很好。
def createfunc():
mylist=[]
def subfunc(x):
assert x is not mylist
return subfunc
f=createfunc()
f(f.func_closure[0].cell_contents) # raises AssertionError