Python对象实例是语言中唯一的对象吗?
我想知道Python如何处理用户定义的对象。下面是一个场景: 我创建了自己的类MyClass:Python对象实例是语言中唯一的对象吗?,python,list,object,python-3.x,Python,List,Object,Python 3.x,我想知道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): s
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唯一地标识同一类的对象实例?list.remove()
删除第一个测试相等的对象。从:
s.remove(x)
从s中删除第一项,其中
s[i]==x
默认情况下,自定义类的实例只有在它们是完全相同的对象时才测试相等;如果s[i]为x
返回true,则s[i]==x
也返回true
定义实例的不是变量名;在第二个示例中,将从列表中删除MyClass(3)
实例,因为它是一个唯一的对象,不同于之前创建和添加的MyClass(5)
实例。您可以使用检查,它在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>]
通过该更改,您可以执行以下操作:
example.Add(MyClass(42))
example.Add(MyClass(81))
example.Remove(MyClass(42))
这将删除
number
设置为42
的实例,您必须使用\uuuuuueq\uuuu
定义它们的比较方式。基本上定位了myclass1==example.container
元素并将其删除。如果您使用的是Python 2,那么在定义\uuuuueq\uuuu
时,您可能希望设置\uuuhash\uuuuu=None
或定义一个合理的\uhash\uuu
方法,所以dicts和set不会发疯。
example.Add(MyClass(42))
example.Add(MyClass(81))
example.Remove(MyClass(42))