Python:以不同的名称向列表结构添加新函数

Python:以不同的名称向列表结构添加新函数,python,list,class,Python,List,Class,这是一个稍微独特的请求。我想看看是否有可能向列表()数据结构中添加其他函数,如“append”,我想在继承列表属性的新类名下添加坐标旋转: class __VecRot(list): def __init__(self, coords): self.coords = coords print coords def double(self): self.coords = [i*2 for i in self.coo

这是一个稍微独特的请求。我想看看是否有可能向列表()数据结构中添加其他函数,如“append”,我想在继承列表属性的新类名下添加坐标旋转:

class __VecRot(list):

    def __init__(self, coords):
        self.coords = coords
        print coords        

    def double(self):
        self.coords = [i*2 for i in self.coords]

a = __VecRot([1,0,0])
这行代码初始化坐标,但它没有将“a”定义为值为[1,0,0]的列表。这样,当执行此代码时

目前

print a

>>> a
[]
我在找

print a

>>> a
[1,0,0]
以及其他功能,以满足以下要求:

a.double()
print a
>>> a
[2,0,0]

是否可以定义a类值?这样它就可以承载现有的数据结构了吗

您正在复制实际的容器。如果您从
列表中派生
,则您已经拥有一个存储器。考虑这一点:

 class __VecRot(list):

     def __init__(self, coords):
         list.__init__(self, coords)

     def double(self):
         for i in range(len(self)):
             self[i] = self[i] * 2

 a = __VecRot([1,0,0])

 a.double()

 print a
或者,如果您仍然有
coords
字段,则不需要从
列表中派生:

 class __VecRot:

     def __init__(self, coords):
         self.coords = coords

     def double(self):
         self.coords = [i*2 for i in self.coords]

     def __len__(self):
         return len(self.coords)

     def __str__(self):
         return "__VecRot["+str(self.coords)+"]"

     def __repr__(self):
         return "__VecRot("+repr(self.coords)+")"

 a = __VecRot([1,0,0])

 a.double()

 print a

这似乎是一个更好的做法。您还应该重载其他列表接口方法(如
\uu getitem\uu
)。因为在Python中,类是否从
list
派生并不重要,只要它包含所有必要的方法。

您复制的是实际的容器。如果您从
列表中派生
,则您已经拥有一个存储器。考虑这一点:

 class __VecRot(list):

     def __init__(self, coords):
         list.__init__(self, coords)

     def double(self):
         for i in range(len(self)):
             self[i] = self[i] * 2

 a = __VecRot([1,0,0])

 a.double()

 print a
或者,如果您仍然有
coords
字段,则不需要从
列表中派生:

 class __VecRot:

     def __init__(self, coords):
         self.coords = coords

     def double(self):
         self.coords = [i*2 for i in self.coords]

     def __len__(self):
         return len(self.coords)

     def __str__(self):
         return "__VecRot["+str(self.coords)+"]"

     def __repr__(self):
         return "__VecRot("+repr(self.coords)+")"

 a = __VecRot([1,0,0])

 a.double()

 print a

这似乎是一个更好的做法。您还应该重载其他列表接口方法(如
\uu getitem\uu
)。因为在Python中,类是否从
list
派生并不重要,只要它包含所有必要的方法。

可以从
list
类继承,在
list
范围内创建自己的自定义函数。你做错了

这比你想象的要简单得多:

class __VecRot(list):

    def double(self):
        self[:] = [i*2 for i in self[:]]
然后你可以这样使用它:

>>> a = __VecRot([1,0,0])
>>> a
[1, 0, 0]
>>> a.double()
>>> a
[2, 0, 0]
>>> a.double()
>>> a
[4, 0, 0]

可以从
列表
类继承,在
列表
范围内创建自己的自定义函数。你做错了

这比你想象的要简单得多:

class __VecRot(list):

    def double(self):
        self[:] = [i*2 for i in self[:]]
然后你可以这样使用它:

>>> a = __VecRot([1,0,0])
>>> a
[1, 0, 0]
>>> a.double()
>>> a
[2, 0, 0]
>>> a.double()
>>> a
[4, 0, 0]

考虑子类<代码>用户列表>代码>而不是<代码>列表>代码>。考虑子类<代码>用户列表< /C> >而不是直接>代码>列表。谢谢,我想我理解了。我现在必须弄明白为什么它可以用一个简单的函数,但不能用一个大函数,包括来自Numpy的操作。。。很好,现在我明白你复制容器的意思了。通过使用
self=blah blah
我重新定义了
self
,因此它在调用中被忽略。当我保存到
self[:]=blah blah
时,我看到它保持相同的容器。Thanks@CromeX是的,没错。没问题!谢谢,我想我明白了。我现在必须弄明白为什么它可以用一个简单的函数,但不能用一个大函数,包括来自Numpy的操作。。。很好,现在我明白你复制容器的意思了。通过使用
self=blah blah
我重新定义了
self
,因此它在调用中被忽略。当我保存到
self[:]=blah blah
时,我看到它保持相同的容器。Thanks@CromeX是的,没错。没问题!