Python对象实例是语言中唯一的对象吗?

2024-10-02 14:16:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道Python如何处理用户定义的对象。下面是一个场景:

我已经创建了自己的类MyClass:

class MyClass():
  def __init__(self):
    # some code here

class MyClassContainer():
  def __init__(self):
    self.container = [] # will store MyClass object instances.
  def Add(self, object):
    self.container.append(object)
  def Remove(self, object):
    self.container.remove(object)

example = MyClassContainer()

myclass1 = MyClass()
example.Add(myclass1)

myclass2 = MyClass()
example.Add(myclass2)

example.Remove(myclass1)

那么问题是,python的remove函数是否能够区分同一类的不同对象实例呢?是否有任何角落的情况下,将不会唯一地确定对象实例我想删除?你知道吗

一种可能的情况是:

myclass1 = MyClass(5)
example.Add(myclass1)

myclass1 = MyClass(3)
example.Add(myclass1)

example.Remove(myclass1)

将删除哪个对象实例?我猜是通过了3,但是有没有一条规则说,python唯一地标识同一类的对象实例?你知道吗


Tags: 对象实例selfaddobjectinitexamplecontainer
1条回答
网友
1楼 · 发布于 2024-10-02 14:16:11

list.remove()删除测试等于的第一个对象。从documentation

s.remove(x)
remove the first item from s where s[i] == x

默认情况下,自定义类的实例只有在它们是完全相同的对象时才测试相等;如果s[i] is x返回true,则s[i] == x也返回true。你知道吗

定义实例的不是变量名;在第二个示例中,它将是从列表中删除的MyClass(3)实例,因为它是一个唯一的对象,不同于之前创建和添加的MyClass(5)实例。您可以用^{} function检查这一点,它在CPython上基本上返回当前内存地址:

>>> myclass1 = MyClass(5)
>>> id(myclass1)
4349144816
>>> example.Add(myclass1)
>>> myclass1 = MyClass(3)
>>> id(myclass1)
4349145040
>>> example.Add(myclass1)
>>> example.container
[<__main__.MyClass object at 0x1033aaef0>, <__main__.MyClass object at 0x1033aafd0>]
>>> hex(id(myclass1))
'0x1033aafd0'
>>> myclass1 is example.container[1]
True
>>> example.Remove(myclass1)
>>> example.container
[<__main__.MyClass object at 0x1033aaef0>]

请注意,自定义类的默认表示形式包括id()十六进制值!你知道吗

您可以通过重写^{} method来改变这种行为;让它根据您自己的条件返回TrueFalse,或者如果另一个对象不是您的类所支持的比较类型,则返回NotImplemented单例(这样Python就可以委托给另一个对象)。你知道吗

例如,当实例的number属性相等时,如果实例应该被认为是相等的,则可以这样实现:

class MyClass():
    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        if not isinstance(other, MyClass):
            return NotImplemented
        return self.number == other.number

有了这个改变,你可以做到:

example.Add(MyClass(42))
example.Add(MyClass(81))
example.Remove(MyClass(42))

这将删除number设置为42的实例。你知道吗

相关问题 更多 >

    热门问题