4

我想

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
        ...

用什么来代替???确保assert永不失败?

(使用 Lisp,我可以使用in 进行创建_my_unique(cons nil nil)使用)。eqassert

PS。用例:我将放入_my_uniquea dict,因此我希望它与自身相等,但我不希望它与dict从外部传入的任何东西相等(在碰撞意义上)。

4

4 回答 4

6

您可以使用object(),但这不会使断言“永不失败”。如果您调用并作为对象myFunc传递,它仍然会失败。MyClass.my_unique另外,如果您想测试它是否是同一个对象,请使用arg is not my_unique而不是!=.

于 2014-03-25T18:03:32.867 回答
2

您可以使用object().

返回一个新的无特征对象。object是所有新样式类的基础。它具有新样式类的所有实例通用的方法。

于 2014-03-25T18:03:46.613 回答
0

如果您要问的是“如何使 MyClass 的每个实例的 _my_unique 唯一”,您可以简单地在构造函数中创建一个新的空对象。

例如:

>>> class MyClass(object):
...     def __init__(self):
...         self._my_unique = object()
... 
>>> foo=MyClass()
>>> bar=MyClass()
>>> foo._my_unique
<object object at 0x100ce70c0>
>>> bar._my_unique
<object object at 0x100ce7090>

如果要隐藏_my_unique,请给它两个下划线。这样,没有人可以意外地获得价值。这并非不可能,但他们需要更加努力地工作才能获得价值。这称为名称修改,您可以在此处阅读更多信息:http: //docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-references

>>> 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'
于 2014-03-25T19:33:31.043 回答
-2

这是一个有点令人困惑的问题,因为它似乎毫无目的地混合了一堆概念。一方面,Python 中的大多数对象都是独一无二的,但可能有多种方法可以访问它们。检查身份的运算符不是!=(不等式)而是is not。与 Java 不同,Python 不要求您将事物放入类中,并且不会隐式查找self(他们称之为隐式this)。consfrom Lisp 用于构造经常形成单链表的对,这种结构在 Python 中不常见,因为我们使用称为列表的动态引用数组。列表是可变的,因此使用list()[]将生成一个唯一对象。

因此,虽然它相当没有意义,但编写一个产生执行无用断言的函数的函数的一种方法可能是:

def createfunc():
  mylist=[]
  def subfunc(x):
    assert x is not mylist
  return subfunc

每次调用都createfunc()返回一个带有自己的新函数mylist。但是,唯一的对象并不意味着无法到达:

f=createfunc()
f(f.func_closure[0].cell_contents)   # raises AssertionError

关于 PS,要与碰撞相关dict,您的对象也必须是hashable,这object()list()唯一对象是更好的选择。

于 2014-03-25T19:56:13.070 回答