Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建唯一的对象?_Python_Cons - Fatal编程技术网

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