gpt4 book ai didi

python - Python 中的同类列表

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:07 24 4
gpt4 key购买 nike

我正在尝试设计一个允许访问特定文件格式内容的 python 模块。该文件本质上是一个层列表(可变),每个层都是一个相对复杂的对象,具有自己的内部结构(与此问题无关)。然而,这种文件格式的严格限制是它不允许“共享”层(即,两个不同的层对象引用相同的数据),并且它是同类.

我正在尝试设计一个 Python API 来表示此文件的内容,同时保持它所表示的概念完整无缺。我希望它尽可能像 pythonic,以便用户更容易使用我的库。

有没有一种方法可以在不提供非直观 API 的情况下在 Python 中实现这一点? (即与列表明显不同的东西)

Python 库中有这方面的示例吗?

下面是一个 super 简化的示例。

图层类

# an example layer class
class Layer:
def __init__(self, content):
self.value = content
def __repr__(self):
return "Layer(" + str(self.value) + ")"

# make a list of layer classes (as if it was loaded from a file)
layers = []
layers.append(Layer(0.0))
layers.append(Layer(2.0))

我希望能够执行的操作

# altering an element
l0 = layers[0]
l0.value = 3.0

# adding an element and altering it later
l1 = Layer(3.0)
layers.append(l1)
l1.value = 5.0

# removing an element
layers.pop(0)

# iterating over elements
for i in layers:
print i

我不想做的操作

我不确定抛出异常是否是在 Python 中处理此类错误的有效方法。

# the layers list should be heterogeneous, inserting anything else than a Layer
# should not be allowed
layers.append(dict())

# there should never be two instances of the same Layer object in any
# instance of the layers array (there *can* be two instances with
# the same data, but they should not be shared)
l2 = Layer(10.0)
layers.append(l2)
layers.append(l2)
l2.value = 300.0

l3 = Layer(13.0)
layers2 = [];
layers.append(l3)
layers2.append(l3)

最后的说明:我是一名闯入 Python 领地的 C++ 程序员。最终实现将在 Python 中包装 C++ 类,我试图避免使用共享指针和/或以无法存储在文件中的方式表示文件数据。我知道使用 gettattr and setattr 的可能性,但这似乎遭到了 Python 程序员的反对,而且我在 Python native 库中找不到使用此方法并具有与我需要的行为相似的行为的示例(这将在他们眼中证明这种方法是合理的)。

最佳答案

这可以通过创建一个重写 append 方法的列表的子类来实现。示例:

class LayerList(list):

def __init__(self, id):
self.id=id
return super(LayerList, self).__init__()


def append(self, item):
#test if the item is a Layer
if not isinstance(item,Layer):
#do whathever treatment you wanna do
raise Exception("Not a Layer object")

#test if the item is already in the list
if item in self:
#do whathever treatment you wanna do
raise Exception("Item already in list")

#check if the layer has the attr "layer_id"
if not hasattr(item,"layer_id"):
setattr(item,"layer_id",None)
item.layer_id=self.id

#call the parents 'append'
super(LayerList, self).append(item)

def pop(self, i=None):
item = super(LayerList, self).pop(i)
item.layer_id=None
return item

关于python - Python 中的同类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27186961/

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