gpt4 book ai didi

Python类返回值

转载 作者:太空狗 更新时间:2023-10-29 17:51:45 26 4
gpt4 key购买 nike

我正在尝试创建一个返回值而不是自身的类。

我将向您展示一个与列表进行比较的示例:

>>> 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 实际上是一种类型而不是类,但我在这里进行了一些简化。)

当您打印一个对象(即获取对象的字符串表示)时,该对象的 __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 实例。如果您想要一个列表实例,只需获取一个列表实例即可。如果问题是 当您打印 或在控制台中查看它们时这些对象看起来像什么,则创建一个 __str____repr__ 方法,按照您希望的方式表示它们。

更新关于平等的新问题

再次声明,__str____repr__ 仅用于打印,不会以任何其他方式影响对象。仅仅因为两个对象具有相同的 __repr__ 值并不意味着它们相等!

MyClass() != MyClass() 因为你的类没有定义它们如何相等,所以它回退到默认行为(object 类型), 即对象只等于它们自己:

>>> 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

我认为你应该做两件事:

  1. 看看this guide to magic method use in Python .
  2. 如果您想要的非常像列表,请证明您为什么不子类化 list。如果子类化不合适,您可以委托(delegate)给包装列表实例:

    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])

关于Python类返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12412324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com