[英]List element Pointer in Python
我的问题来自此页面 ,而我想为列表元素创建一个指针(类似东西)。 该元素是一个原始值(字符串),因此我必须按照该页面的说明创建一个FooWrapper类。
我知道通过设置__repr__
可以直接访问此值。
class FooWrapper(object):
def __init__(self, value):
self.value = value
def __repr__(self):
return repr(self.value)
>>> bar=FooWrapper('ABC')
>>> bar
'ABC'
>>> bar=FooWrapper(3)
>>> bar
3
现在,我可以将其用作字符串的引用:
>>> L=[3,5,6,9]
>>> L[1]=FooWrapper('ABC')
>>> L
[3,'ABC',6,9]
>>> this=L[1]
>>> this.value='BCD'
>>> print(L)
[3,'BCD',6,9]
因此,现在对于列表元素L[1]
有一个类似this
的指针。
但是,这仍然很不方便,因为我必须使用this.value='BCD'
来更改其值。 虽然存在__repr__
方法,使this
直接返回this.value
,有没有类似的方法,使this='BCD'
做this.value='BCD'
? 我知道这会改变绑定规则。但是无论如何,这可能吗?
如果列表元素指针有更好的解决方案,我也将不胜感激。
先感谢您:)
我不确定您要做什么,但是您可以执行以下操作:
class FooWrapper(object):
def __init__(self, value):
self.value = value
def __repr__(self):
return 'FooWrapper(' + repr(self.value) + ')'
def __str__(self):
return str(self.value)
def __call__(self,value):
self.value = value
在这里,我摆脱了使用__repr__
隐藏FooWrapper
想法,因为我认为向程序员隐藏REPL发生的事情是一个坏主意。 相反,我使用__str__
以便在打印对象时将打印包装的值。 __call__
是默认方法,它不会更改=
的含义,但可以满足您的要求:
>>> vals = [1,2,3]
>>> vals[1] = FooWrapper("Bob")
>>> vals
[1, FooWrapper('Bob'), 3]
>>> for x in vals: print(x)
1
Bob
3
>>> this = vals[1]
>>> this(10)
>>> vals
[1, FooWrapper(10), 3]
但是,我认为这会使人误解的,以this
作为一个指针。 它只是一个包装对象,几乎可以肯定会使得处理包装对象不方便。
编辑时:以下更多是指向列表的指针 。 它使您可以创建类似于__call__
的指针对象,该对象用于取消引用指针(当没有参数传递给它时)或使列表变异(当值传递给__call__
)。 它还实现了一种带有( pp
)的p++
形式(带有环绕)(尽管当然可以删除环绕部分):
class ListPointer(object):
def __init__(self, myList,i=0):
self.myList = myList
self.i = i % len(self.myList)
def __repr__(self):
return 'ListPointer(' + repr(self.myList) + ',' + str(self.i) + ')'
def __str__(self):
return str(self.myList[self.i])
def __call__(self,*value):
if len(value) == 0:
return self.myList[self.i]
else:
self.myList[self.i] = value[0]
def pp(self):
self.i = (self.i + 1) % len(self.myList)
像这样使用:
>>> vals = ['a','b','c']
>>> this = ListPointer(vals)
>>> this()
'a'
>>> this('d')
>>> vals
['d', 'b', 'c']
>>> this.pp()
>>> this()
'b'
>>> print(this)
b
我认为这是一种更透明的方式来获取类似于列表指针的内容。 它不需要将指向的东西包装在任何东西中。
__repr__
方法可以获取所需的字符串。 假设它说return repr(self.value) + 'here'
。 如果您说this = '4here'
,应该受到什么影响? 应该self.value
被分配到4
或4here
? 如果this
具有另一个称为key
属性并且__repr__
return repr(self.key) + repr(self.value)
怎么办? 当您执行this = '4here'
,它会将self.key
分配给整个字符串,将self.value
分配给整个字符串,还是将self.key
分配给4
并将self.value
分配给here
? 如果字符串完全由该方法组成怎么办? 如果说return 'here'
,我应该this = '4here'
吗?
简而言之,你不能。
根据约翰·科尔曼的想法进行自我回答:
class ListPointer(object):
def __init__(self,list,index):
self.value=list[index]
list[index]=self
def __repr__(self):
return self.value
def __call__(self,value):
self.value=value
>>> foo=[2,3,4,5]
>>> this=ListPointer(foo,2)
>>> this
4
>>> foo
[2,3,4,5]
>>> this('ABC')
>>> foo
[2,3,'ABC',5]
>>> type(foo(2))
<class '__main__.ListPointer'>
ListPointer
对象接受一个列表和一个索引,将list[index]
存储在self.value
,然后用self
替换list元素。 类似地,也可以实现pp
方法,同时应该恢复前一个元素,然后用self
对象替换下一个元素。 通过直接引用foo[2]
也可以得到该对象,这正是我想要的。 (也许应该将其称为引用而不是指针。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.