Python:以不同的名称向列表结构添加新函数
这是一个稍微独特的请求。我想看看是否有可能向列表()数据结构中添加其他函数,如“append”,我想在继承列表属性的新类名下添加坐标旋转: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
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是的,没错。没问题!