当前位置: 首页 > 面试题库 >

类对象是单例吗?

郗俊能
2023-03-14
问题内容

如果我们拥有x = type(a)and x == y,是否必然暗示这一点x is y

这是一个反例,但这是一个作弊:

>>> class BrokenEq(type):
...     def __eq__(cls, other):
...         return True
...     
>>> class A(metaclass=BrokenEq):
...     pass
... 
>>> a = A()
>>> x = type(a)
>>> x == A, x is A
(True, True)
>>> x == BrokenEq, x is BrokenEq
(True, False)

而且我无法创建这样的反例:

>>> A1 = type('A', (), {})
>>> A2 = type('A', (), {})
>>> a = A1()
>>> x = type(a)
>>> x == A1, x is A1
(True, True)
>>> x == A2, x is A2
(False, False)

为了澄清我的问题-在 不让相等 运算符做某些疯狂的事情的情况下,一个类是否有可能存在于两个不同的内存位置,或者导入系统会以某种方式防止这种情况发生?

如果是这样,我们如何证明这种行为-
例如,使用reload或做奇怪的事情__import__

如果不是,是否由语言保证或在任何地方进行了记录?

结语

# thing.py
class A:
    pass

最后,这是为我澄清了真实行为的要素(它支持了Blckknght答案中的主张)

>>> import sys
>>> from thing import A
>>> a = A()
>>> isinstance(a, A), type(a) == A, type(a) is A
(True, True, True)
>>> del sys.modules['thing']
>>> from thing import A
>>> isinstance(a, A), type(a) == A, type(a) is A
(False, False, False)

因此,尽管使用的代码importlib.reload可能会破坏通过类标识进行的类型检查,但isinstance无论如何它也会破坏。


问题答案:

不,除了弄乱元类__eq__方法之外,没有办法创建两个相等但不相同的类对象。

但是,这种行为不是类所独有的。对于没有__eq__在其类中定义方法的任何对象,这都是默认行为。该行为是从继承的object,后者是所有其他(新样式)类的基类。它仅对具有相等性其他语义的内置类型(例如,用于比较其内容的容器类型)和定义__eq__自己的运算符的自定义类覆盖。

至于在不同的内存位置将两个不同的引用指向同一个类,由于Python的对象语义,这实际上是不可能的。对象的内存位置
其身份(至少在cpython中)。与相同内容的另外一类可以存在别的地方,但像你A1A2例子,这将被看作是所有的Python逻辑不同的对象。



 类似资料:
  • 问题内容: 类对象在JVM中是否保证是唯一的,它们是Singletons吗?即会 永远成立,是 当且仅当 其中a和b是类型? 问题答案: 每个类加载器可以有一个单例和/或类。 如果(除非a为)必须为true

  • 问题内容: 我对Python 3中的和类有些困惑。也许有人可以消除我的困惑或提供一些其他信息。 我目前的理解是,每个类(除外)都从称为的基类继承。但是每个类(包括)也是该类的一个实例,它是自身的实例,并且也从继承。 我的问题是: 是否有一个原因/设计决策,为什么是的实例并从中继承?对象的/ class是否也可以是对象本身? 类()如何成为其自身的实例? 哪一个是真正的基类或? 我一直认为这将是最“

  • 问题内容: 怎么有一个类的实例是,而该类不是的子类呢?这是一个例子: 问题答案: 在Python 2中, 类型 和 类 不是同一对象,特别是对于老式类, 它与对象是不同的。因此这是可能的,因为老式类的实例实际上是与其类不同的类型(): 这在新型类中得以解决: 旧样式类不是类型,新样式类是: 旧样式类被声明为已弃用。在Python 3中,只有新型类。等效于并且您的代码将在两次检查中产生。 看一下这个

  • 对于这个示例: null 是否有类似这样的语句用于此检查?或者我应该使用

  • 问题内容: 我已经有一段时间没有接触过Mockito了,我也从未广泛使用它。但是今天,在一些新代码中,我想使用最佳实践,因此我使用以下Java版本退出了模仿内核2.0.54-beta: 我需要此接口的实例进行测试: https://bitbucket.org/globalmentor/rincl/src/bf0e8875a1bae16247dd904e0b8bc067c9f8abc9/src/ma

  • 我有一段时间没有接触过Mockito,也从来没有大量使用过它。但是今天在一些新代码中,我希望使用最佳实践,所以我使用以下Java版本推出了mockito-core 2.0.54-beta: 要重现此问题,请克隆https://bitbucket.org/globalmentor/rincl.git并签出commit2f88d7c5e5ac17b6d316ed54c12cb7b447b7d6ac。然