我正在尝试创建一个返回值的类,而不是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等函数。
答案 0 :(得分:25)
我认为你对发生的事情感到非常困惑。
在Python中,一切都是对象:
[]
(列表)是一个对象'abcde'
(字符串)是一个对象1
(整数)是一个对象MyClass()
(一个实例)是一个对象MyClass
(一个类)也是一个对象list
(一种类型 - 很像一个类)也是一个对象它们都是“价值”,因为它们是一种东西,而不是指某种东西的名称。 (变量是指代值的名称。)值与Python中的对象不同。
当您调用类对象(如MyClass()
或list()
)时,它会返回该类的实例。 (list
实际上是一个类型,而不是一个类,但我在这里简化了一点。)
当您打印一个对象(即获取对象的字符串表示)时,将调用该对象的__str__
or __repr__
magic method并打印返回的值。
例如:
>>> 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(),而不是实例信息,”没有任何意义。 list()
返回列表实例。 MyClass()
返回一个MyClass实例。如果你想要一个列表实例,只需获取一个列表实例。如果问题是当您print
这些对象或在控制台中查看它们时这些对象是什么样的,那么创建一个__str__
和__repr__
方法代表他们,因为你希望他们被代表。
__str__
和__repr__
仅用于打印,并且不会以任何其他方式影响对象。仅仅因为两个对象具有相同的__repr__
值并不意味着它们是相等的!
MyClass() != MyClass()
因为你的类没有定义它们是如何相等的,所以它回退到(object
类型的)默认行为,即对象只等于它们自己: / p>
>>> m = MyClass()
>>> m1 = m
>>> m2 = m
>>> m1 == m2
True
>>> m3 = MyClass()
>>> m1 == m3
False
如果您想更改此设置,请使用one of the comparison magic methods
例如,您可以拥有一个等于所有内容的对象:
>>> 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
我认为你应该做两件事:
证明为什么你不是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)
现在这将作为列表而不是列表(即没有子类化list
)。
>>> c = MyClass()
>>> c.append(1)
>>> c
MyClass([1])
答案 1 :(得分:16)
如果你想要的是一种将你的类变成列表而没有子类化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...]
如果您的意思是print MyClass()
会打印一个列表,只需覆盖__repr__
:
class MyClass():
def __init__(self):
self.value1 = 1
self.value2 = 2
def __repr__(self):
return repr([self.value1, self.value2])
编辑:
我觉得你的意思是如何制作对象比较。为此,您可以覆盖__cmp__
方法。
class MyClass():
def __cmp__(self, other):
return cmp(self.get_list(), other.get_list())
答案 2 :(得分:7)
使用__new__
从类中返回值。
正如其他人建议__repr__
,__str__
甚至__init__
(某种程度上)可以为您提供您想要的内容,但__new__
将是一个语义上更好的解决方案,因为您的目的你想要返回实际的对象,而不仅仅是它的字符串表示。
阅读此答案,了解有关__str__
和__repr__
的更多见解
https://stackoverflow.com/a/19331543/4985585
class MyClass():
def __new__(cls):
return list() #or anything you want
>>> MyClass()
[] #Returns a true list not a repr or string
答案 3 :(得分:6)
class MyClass():
def __init__(self, a, b):
self.value1 = a
self.value2 = b
def __call__(self):
return [self.value1, self.value2]
测试:
>>> x = MyClass('foo','bar')
>>> x()
['foo', 'bar']
答案 4 :(得分:4)
您正在描述一个函数,而不是一个类。
def Myclass():
return []
答案 5 :(得分:0)
对我来说,可行的命题是__call__
,他在班上创建了一个小数字列表:
import itertools
class SmallNumbers:
def __init__(self, how_much):
self.how_much = int(how_much)
self.work_list = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉']
self.generated_list = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉']
start = 10
end = 100
for cmb in range(2, len(str(self.how_much)) + 1):
self.ListOfCombinations(is_upper_then=start, is_under_then=end, combinations=cmb)
start *= 10
end *= 10
def __call__(self, number, *args, **kwargs):
return self.generated_list[number]
def ListOfCombinations(self, is_upper_then, is_under_then, combinations):
multi_work_list = eval(str('self.work_list,') * combinations)
nbr = 0
for subset in itertools.product(*multi_work_list):
if is_upper_then <= nbr < is_under_then:
self.generated_list.append(''.join(subset))
if self.how_much == nbr:
break
nbr += 1
并运行它:
if __name__ == '__main__':
sm = SmallNumbers(56)
print(sm.generated_list)
print(sm.generated_list[34], sm.generated_list[27], sm.generated_list[10])
print('The Best', sm(15), sm(55), sm(49), sm(0))
结果
['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉', '₁₀', '₁₁', '₁₂', '₁₃', '₁₄', '₁₅', '₁₆', '₁₇', '₁₈', '₁₉', '₂₀', '₂₁', '₂₂', '₂₃', '₂₄', '₂₅', '₂₆', '₂₇', '₂₈', '₂₉', '₃₀', '₃₁', '₃₂', '₃₃', '₃₄', '₃₅', '₃₆', '₃₇', '₃₈', '₃₉', '₄₀', '₄₁', '₄₂', '₄₃', '₄₄', '₄₅', '₄₆', '₄₇', '₄₈', '₄₉', '₅₀', '₅₁', '₅₂', '₅₃', '₅₄', '₅₅', '₅₆']
₃₄ ₂₇ ₁₀
The Best ₁₅ ₅₅ ₄₉ ₀