Har*_*che 12 python return class
我正在尝试创建一个返回值的类,而不是self.
我将向您展示一个与列表比较的示例:
>>> l = list()
>>> print(l)
[]
>>> class MyClass:
>>> pass
>>> mc = MyClass()
>>> print mc
<__main__.MyClass instance at 0x02892508>
Run Code Online (Sandbox Code Playgroud)
我需要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
Run Code Online (Sandbox Code Playgroud)
为什么是m1 == m2假的?这是个问题.
如果我不响应所有人,我很抱歉.我正在尝试你给我的所有解决方案.我无法使用def,因为我需要使用setitem,getitem等功能.
Fra*_*ila 26
我认为你对发生的事情感到非常困惑.
在Python中,一切都是对象:
[] (列表)是一个对象'abcde' (字符串)是一个对象1 (整数)是一个对象MyClass() (一个实例)是一个对象MyClass (一类)也是一个对象list (一种类型 - 很像一个类)也是一个对象它们都是"价值",因为它们是一种东西,而不是指一种东西的名称.(变量是指代值的名称.)值与Python中的对象不同.
当您调用类对象(如MyClass()或list())时,它将返回该类的实例.(list实际上是一个类型,而不是一个类,但我在这里简化了一点.)
当您打印对象(即获取对象的字符串表示)时,将调用该对象__str__或__repr__魔术方法并打印返回的值.
例如:
>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)
所以你要求的是,"我需要MyClass返回一个列表,比如list(),而不是实例信息,"没有任何意义. list()返回一个列表实例.MyClass()返回一个MyClass实例.如果你想要一个列表实例,只需获取一个列表实例.如果问题反而是做这些物体看起来就像当你print他们或看他们在控制台,然后创建一个__str__和__repr__你希望他们表示这代表他们的方法.
再次,__str__并且__repr__仅用于打印,并且不以任何其他方式影响对象.仅仅因为两个对象具有相同的__repr__值并不意味着它们是相等的!
MyClass() != MyClass()因为你的类没有定义它们如何相等,所以它回退到(object类型的)默认行为,即对象只等于它们自己:
>>> m = MyClass()
>>> m1 = m
>>> m2 = m
>>> m1 == m2
True
>>> m3 = MyClass()
>>> m1 == m3
False
Run Code Online (Sandbox Code Playgroud)
如果要更改此设置,请使用其中一种比较魔术方法
例如,您可以拥有一个等于所有内容的对象:
>>> 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
Run Code Online (Sandbox Code Playgroud)
我认为你应该做两件事:
证明为什么你不是子类,list如果你想要的是非常类似列表.如果子类化不合适,则可以委托给包装列表实例:
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)
Run Code Online (Sandbox Code Playgroud)
现在,这将作为列表而不是列表(即,没有子类list).
>>> c = MyClass()
>>> c.append(1)
>>> c
MyClass([1])
Run Code Online (Sandbox Code Playgroud)lol*_*pop 18
如果你想要的是一种将你的类变成没有子类化的列表list的方法,那么只需创建一个返回列表的方法:
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...]
Run Code Online (Sandbox Code Playgroud)
如果你的意思是print MyClass()打印一个列表,只需覆盖__repr__:
class MyClass():
def __init__(self):
self.value1 = 1
self.value2 = 2
def __repr__(self):
return repr([self.value1, self.value2])
Run Code Online (Sandbox Code Playgroud)
编辑:我看到你的意思是如何使对象比较.为此,您重写该__cmp__方法.
class MyClass():
def __cmp__(self, other):
return cmp(self.get_list(), other.get_list())
Run Code Online (Sandbox Code Playgroud)
用于__new__从类返回值.
正如其他人建议__repr__,__str__甚至__init__(在某种程度上)可以给你想要的东西,但__new__因为要返回的实际对象,而不仅仅是它的字符串表示将供您使用语义上更好的解决方案.
阅读此答案以获取更多见解__str__和__repr__
/sf/answers/1353208041/
class MyClass():
def __new__(cls):
return list() #or anything you want
>>> MyClass()
[] #Returns a true list not a repr or string
Run Code Online (Sandbox Code Playgroud)
小智 6
class MyClass():
def __init__(self, a, b):
self.value1 = a
self.value2 = b
def __call__(self):
return [self.value1, self.value2]
Run Code Online (Sandbox Code Playgroud)
测试:
>>> x = MyClass('foo','bar')
>>> x()
['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)