Python class returning value
我试图创建一个返回值的类,而不是self。
我将向您展示一个与列表比较的示例:
1 2 3 4 5 6 7 8 9 | >>> l = list() >>> print(l) [] >>> class MyClass: >>> pass >>> mc = MyClass() >>> print mc <__main__.MyClass instance at 0x02892508> |
我需要MyClass返回一个列表,就像
我想模仿一个列表(或其他对象):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | >>> l1 = list() >>> l2 = list() >>> l1 [] >>> l2 [] >>> l1 == l2 True >>> class MyClass(): def __repr__(self): return '[]' >>> m1 = MyClass() >>> m2 = MyClass() >>> m1 [] >>> m2 [] >>> m1 == m2 False |
为什么
如果我没有对你们所有人作出回应,我很抱歉。我正在尝试你给我的所有解决方案。我不能使用
我认为你对正在发生的事情很困惑。
在Python中,一切都是一个对象:
[] 是一个对象。'abcde' (字符串)是一个对象1 (整数)是一个对象MyClass() 是一个对象。MyClass 类也是一个对象list (一个类型——很像一个类)也是一个对象
它们都是"价值观",从某种意义上说,它们是一个事物,而不是指一个事物的名称。(变量是引用值的名称。)值与Python中的对象没有什么不同。
当调用一个类对象(如
打印对象(即获取对象的字符串表示形式)时,将调用该对象的
例如:
1 2 3 4 5 6 7 8 9 10 11 12 | >>> class MyClass(object): ... def __str__(self): ... return"MyClass([])" ... def __repr__(self): ... return"I am an instance of MyClass at address"+hex(id(self)) ... >>> m = MyClass() >>> print m MyClass([]) >>> m I am an instance of MyClass at address 0x108ed5a10 >>> |
所以,您所要求的"我需要MyClass返回一个列表,比如list(),而不是实例信息",没有任何意义。
再一次,
1 2 3 4 5 6 7 8 | >>> m = MyClass() >>> m1 = m >>> m2 = m >>> m1 == m2 True >>> m3 = MyClass() >>> m1 == m3 False |
如果你想改变这一点,使用比较魔术的方法之一
例如,您可以拥有一个等于所有内容的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | >>> class MyClass(object): ... def __eq__(self, other): ... return True ... >>> m1 = MyClass() >>> m2 = MyClass() >>> m1 == m2 True >>> m1 == m1 True >>> m1 == 1 True >>> m1 == None True >>> m1 == [] True |
我认为你应该做两件事:
如果您想要的是类似于列表的东西,那么就说明为什么不将
1 2 3 4 5 6 7 8 9 10 11 12 13 | class MyClass(object): def __init__(self): self._list = [] def __getattr__(self, name): return getattr(self._list, name) # __repr__ and __str__ methods are automatically created # for every class, so if we want to delegate these we must # do so explicitly def __repr__(self): return"MyClass(%s)" % repr(self._list) def __str__(self): return"MyClass(%s)" % str(self._list) |
这现在就像一个没有列表的列表(也就是说,没有子类化
1 2 3 4 | >>> c = MyClass() >>> c.append(1) >>> c MyClass([1]) |
如果您想要的是一种将类转换为列表的方法,而不需要对
1 2 3 4 5 6 7 8 9 10 11 | def MyClass(): def __init__(self): self.value1 = 1 self.value2 = 2 def get_list(self): return [self.value1, self.value2...] >>>print MyClass().get_list() [1, 2...] |
如果您的意思是
1 2 3 4 5 6 7 | class MyClass(): def __init__(self): self.value1 = 1 self.value2 = 2 def __repr__(self): return repr([self.value1, self.value2]) |
编辑:我明白你的意思是如何使物体相互比较。为此,您将重写
1 2 3 | class MyClass(): def __cmp__(self, other): return cmp(self.get_list(), other.get_list()) |
使用
正如其他人所说,
阅读此答案,了解更多有关
1 2 3 4 5 6 | class MyClass(): def __new__(cls): return list() #or anything you want >>> MyClass() [] #Returns a true list not a repr or string |
1 2 3 4 5 6 7 | class MyClass(): def __init__(self, a, b): self.value1 = a self.value2 = b def __call__(self): return [self.value1, self.value2] |
测试:
1 2 3 | >>> x = MyClass('foo','bar') >>> x() ['foo', 'bar'] |
您描述的是函数,而不是类。
1 2 | def Myclass(): return [] |