在 python 中创建和比较 class 个没有变量赋值的实例

Creating and comparing class instances without variable assignment in python

虽然 "playing" 在 Python 中使用 OOP 范式,但我遇到了一些误解。 让我们看一些小例子:

class A(object):
    pass

print id(A()), id(A())    # 139865221604432 139865221604432
print id(A()) == id(A())  # True
print A() is A()          # False
a1 = A()                  
print id(a1)              # 139865221604432
a2 = A()
print id(a2)              # 139865220638096

所以问题是为什么第一个打印示例的 ID 号对于两个实例都是相同的。当我们查看 A() is A() 时,我们可以看到所有内容都是 'ok',结果为 False。不确定,但它可以处理垃圾回收吗?

另一个例子:

class B(object):

    def __init__(self):
        self.msg = 'Some default message'
        print id(self)

    def do_smth(self, msg):
        self.msg = msg

    def get_msg(self):
        return self.msg

那么我们有两种情况。

第一名:

B().do_smth(B().get_msg() + ' add')

第二

b = B()
b.do_smth(b.get_msg() + ' add')

据我所知,第二种方法更可取,因为我们不像第一种那样创建两个实例。但是,当我们遇到第一种方法时,有什么有趣的案例吗?

从 Python documentationid 函数...

Two objects with non-overlapping lifetimes may have the same id() value.

当你这样做时

print id(A()), id(A())

它为每个对象打印相同的 id,因为第一个对象超出了范围。您创建的 A 的每个实例仅在调用 id 时存在。一旦变量超出范围,它就可以被收集并重用它的 id。一旦您将对象分配给一个变量,它就不能被重用,直到变量超出范围。

在你的第二个例子中,第二种形式优于第一种形式的原因是通常对象实例的状态不同。您的第一个表单真正起作用是因为 B 的所有实例都具有相同的值 - 对于 class,这是一个不寻常的 属性。然而,值得注意的是,向对象请求一段数据然后将该数据作为方法参数返回给对象通常不是最佳 OO 实践。