Python:类实例可以计算为任何类型吗?

2024-05-01 22:07:17 发布

您现在位置:Python中文网/ 问答频道 /正文

一个类可以通过其-uu str_uu方法充当字符串,也可以通过其调用方法充当函数。它能充当,比如说,一个列表,或者一个元组吗?在

class A (object):
    def __???__ (self):
        return (1, 2, 3)

>>> a = A()
>>> a * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)

编辑…

这里有一个更好的例子来帮助澄清上述问题。在

^{pr2}$

基本上,我想要的是类似于不返回字符串,但当我简单地调用指向向量实例的名称时返回一个元组(或列表),但我不想失去实例中其余的功能,如访问其他属性和方法。我也不想使用w.vector.vec来获取数据。我希望vector充当w的元组属性,同时仍然能够执行w.vector.whatever()之类的操作,或者重写{mul},这样我就可以通过w.vector * 5来缩放向量。可能吗?在


Tags: 实例方法函数字符串self列表属性object
3条回答

根据您的目标,您可以创建继承自list或{}等内置类的类:

>>> class A(tuple):
...     def speak(self):
...         print "Bark!"
... 
>>> a = A((1,2,3)) # extra parens needed to distinguish single tuple arg from 3 scalar args
>>> a * 3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
>>> a.speak()
Bark!

考虑到你的向量用例,元组的子类化可能会很好地解决这个问题。在

^{pr2}$

对于示例中的特定行为(A*3给出了A中数据的三个连接副本),您希望实现__mul__()运算符。在

例如,它们是等效的:

>>> a = [1,2,3]
>>> a*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> a.__mul__(3)
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> 

更一般地说,如果你想实现一个序列类型,你必须实现所有的operations defined for sequence types。你必须定义-

  • A[3]是什么意思(__getitem__()__setitem__()
  • A[1:10]是什么意思(__getslice__()
  • for item in A:是什么意思(__iter__()

等等。在

以下是在lists上定义的方法的完整列表:

^{pr2}$

当您调用str时,类不充当字符串。它创建并返回一个新的string对象。基本上,当您对一个对象调用str(something)时,实际发生的情况是:

a = str(someObject)

a = someObject.__str__()

因此str函数基本上可以认为是这样做的:

^{pr2}$

当您调用list()tuple()set()等时也是如此。如果我认为你的要求是正确的:

tuple()list()set()都调用类的__iter__()方法,因此您需要做的是:

class MyClass(object):
    ...
    def __iter__(self):
        ...
        return myIterable

相关问题 更多 >