gpt4 book ai didi

python 类: questions about creating instances

转载 作者:行者123 更新时间:2023-11-28 19:56:19 24 4
gpt4 key购买 nike

我正在使用 python 2.7,我想使用类创建某种数据结构

问题一:

假设我创建了这个类:

class my_data():
def __init__(self,data1,data2,data3):
self.data1 = data1
self.data2 = data2
self.data3 = data3

然后我创建了类的一些实例,例如

d1 = my_data(1,2,None)
d2 = my_data(4,5,d1)
d3 = my_data(7,8,d2)

如你所见,data3 可能是 None 或一个实例。到目前为止一切顺利。

现在,让我们再次尝试创建一些其他实例(困难的方法):

d2 = my_data(4,5,d1)
d1 = my_data(1,2,None)
d3 = my_data(7,8,d2)

此时会出现NameError异常,因为显然符合d2 = my_data(4,5,d1), d1尚未定义。

所以,问题来了:我想创建一个实例,其中 data3 应该是 None 或一个实例。如果 data3 是 None 或一个已存在的实例,没问题。但是,如果 data3 引用一个不存在的实例,我希望创建该实例。

例如:d2 = my_data(4,5,d1)

如果 d1 不存在,我想作为一个虚拟实例 d1 = my_data(None,None,None) 启动,然后再启动 d2

我试过了,但似乎没有成功:

class my_data():
def __init__(self,data1,data2,data3):
self.data1 = data1
self.data2 = data2
try:
self.data3 = data3
except:
data3 = my_data(None,None,None)
self.data3 = data3

问题 B:

假设我们以某种方式创建了该类的一些实例 (d1,d2,d3,...)。我如何将实例存储在类中的列表中,以便在此类中创建的每个实例都包含在列表中?

类似于 my_data.my_list()这将产生[d1, d2, d3, ...]

任何想法将不胜感激

最佳答案

您不能从不存在的引用中具体化对象。 Python 名称​​必须存在才能工作。

相反,给 data3 关键字一个默认值,然后当关键字指定时,创建实例:

_sentinel = object()

class my_data():
def __init__(self, data1, data2, data3=_sentinel):
if data3 is _sentinel:
data3 = my_data(None, None, None)

self.data1 = data1
self.data2 = data2
self.data3 = data3

现在您可以使用 data3 的默认新实例创建 my_data() 的实例:

>>> d2 = my_data('a', 'b')
>>> d1 = d2.data3
>>> d1
<__main__.my_data instance at 0x10e994cf8>
>>> vars(d2), vars(d1)
({'data1': 'a', 'data3': <__main__.my_data instance at 0x10e994cf8>, 'data2': 'b'}, {'data1': None, 'data3': None, 'data2': None})

因为我们使用了 sentinel 默认值,你仍然可以将 data3 设置为 None:

>>> d3 = my_data('a', 'b', None)
>>> d3.data3 is None
True

类中的可变列表可以包含所有实例;只需将列表设置为类属性并向其附加新实例:

_sentinel = object()

class my_data():
instances = []

def __init__(self, data1, data2, data3=_sentinel):
if data3 is _sentinel:
data3 = my_data(None, None, None)

self.data1 = data1
self.data2 = data2
self.data3 = data3

my_data.instances.append(self)

并且您可以使用 my_data.instances 列出所有实例。

请注意,这会创建循环引用,即使您不再在其他任何地方使用它们,也会使实例保持事件状态。使用 weakref module如果你想阻止这种情况。

关于 python 类: questions about creating instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348517/

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