我试图创建一个返回值的类,而不是self。
我将向您展示一个与列表比较的示例:
>>> l = list()
>>> print(l)
[]
>>> class MyClass:
>>> pass
>>> mc = MyClass()
>>> print mc
<__main__.MyClass instance at 0x02892508>
我需要MyClass返回一个列表,就像list()
那样,而不是实例信息。我知道我可以做列表的一个子类。但是有没有一种方法可以不用子类化来实现呢?
我想模仿一个列表(或其他对象):
>>> l1 = list()
>>> l2 = list()
>>> l1
[]
>>> l2
[]
>>> l1 == l2
True
>>> class MyClass():
def __repr__(self):
return '[]'
>>> m1 = MyClass()
>>> m2 = MyClass()
>>> m1
[]
>>> m2
[]
>>> m1 == m2
False
为什么m1 == m2
是假的?这就是问题所在。
如果我不回复你们,我很抱歉。我在尝试你给我的所有解决方案。我不能使用def
,因为我需要使用setitem、getitem等函数
我想你对正在发生的事情很困惑。
在Python中,一切都是一个对象:
[]
(列表)是一个对象'abcde'
(字符串)是一个对象1
(整数)是一个对象MyClass()
(实例)是一个对象MyClass
(类)也是一个对象list
(类型——很像类)也是一个对象它们都是“价值”,因为它们是一个事物,而不是指一个事物的名称。(变量是引用值的名称。)值与Python中的对象没有什么不同。
当调用类对象(比如
MyClass()
或list()
)时,它返回该类的一个实例。(list
实际上是一个类型,而不是一个类,但我在这里要简化一点。)当打印对象(即获取对象的字符串表示)时,将调用该对象的^{} or ^{} magic method ,并打印返回值。
例如:
所以你所要求的“我需要我的类返回一个列表,比如list(),而不是实例信息”没有任何意义。
list()
返回一个列表实例。MyClass()
返回MyClass实例。如果您想要一个列表实例,只需获取一个列表实例。如果问题是当您print
这些对象或在控制台中查看它们时,它们是什么样子的,那么创建一个__str__
和__repr__
方法来表示它们,就像您希望它们被表示一样。关于平等的新问题的更新
再次声明,
__str__
和__repr__
仅用于打印,不会以任何其他方式影响对象。仅仅因为两个对象具有相同的__repr__
值并不意味着它们是相等的!MyClass() != MyClass()
因为您的类没有定义它们是如何相等的,所以它返回到默认行为(属于object
类型),即对象只等于它们自己:如果要更改,请使用one of the comparison magic methods
例如,可以有一个等于所有内容的对象:
我认为你应该做两件事:
如果你想要的是列表式的,那么就证明为什么你没有子类化
list
。如果子类化不合适,则可以委托给包装的列表实例:这将像一个没有列表的列表(即,没有子类化
list
)。使用
__new__
从类返回值。正如其他人建议的那样,
__repr__
,__str__
甚至__init__
(以某种方式)可以给你想要的,但是__new__
对于你的目的来说是一个语义上更好的解决方案,因为你希望返回实际的对象,而不仅仅是它的字符串表示。阅读此答案了解有关
__str__
和__repr__
的更多信息 https://stackoverflow.com/a/19331543/4985585如果您想要的是一种不需要子类化
list
而将类转换为列表的方法,那么只需创建一个返回列表的方法:如果您的意思是
print MyClass()
将打印列表,请重写__repr__
:编辑: 我知道你的意思是如何让对象进行比较。为此,可以重写
__cmp__
方法。相关问题 更多 >
编程相关推荐