Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类:关于创建实例的问题_Python_Class - Fatal编程技术网

python类:关于创建实例的问题

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

我正在使用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_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)