python类:关于创建实例的问题
我正在使用Python2.7,我想使用类创建某种数据结构 问题A: 假设我创建了这个类:python类:关于创建实例的问题,python,class,Python,Class,我正在使用Python2.7,我想使用类创建某种数据结构 问题A: 假设我创建了这个类: 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_d
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或实例。到目前为止还不错
现在,让我们再次尝试创建一些其他实例(困难的方式):
在这种情况下,会发生NameError异常,因为显然是在同一行中
d2=我的_数据(4,5,d1),d1尚未定义
所以,问题是:我想创建实例,其中data3应该是None或instance。
如果data3为None或已存在实例,则没有问题。
但如果data3引用了一个未列出的实例,我希望创建该实例
例如:d2=我的_数据(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 = 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\u data.instances
列出所有实例
请注意,这会创建循环引用,即使在其他地方不再使用实例,也会保持实例的活动状态。如果要防止这种情况发生,请使用。您是否考虑过重新设计数据结构和对象?在对象a内部创建对象a的实例不是一个好方法。也许你应该把my_数据分成两个对象。一个保存两个值,另一个保存关系和列表
PS:我强烈怀疑您正在使用my_数据表示图形,如果是这样,请尝试Networkx,这是一个很好的图形资料包。未向
my_数据
构造函数传递名称d1
。它被传递给变量d1
所指的对象。如果d1
没有引用任何内容,则namererror
会在构造函数对此采取任何措施之前发生。实际上,我确实希望使用networkx来表示由管道组成的液压网络。每个管道都应该是一个节点,通过边缘与其他管道连接。每个对象管道都应该类似于管道(ID、长度、流量、父管道)。主要目标是找到一种巧妙的方法从txt文件中插入随机排序的数据:ID_1、长度_1、流量_1、父级_1(整数、浮点、浮点、整数或字符串)ID_2、长度_2、流量_2、父级_2(每组代表一个管道)。。。以某种方式转换父\u 1,父\u 2,。。。从整数到对象管道,最后使用networkx下的树中的所有数据进行构造
>>> 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)