Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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_Database_Oop_Python 3.x - Fatal编程技术网

Python 传递类实例化(分层)

Python 传递类实例化(分层),python,database,oop,python-3.x,Python,Database,Oop,Python 3.x,程序设计: 类,它实现较低级别的数据处理 类B-E,为a提供更高级别的接口以执行各种功能 类F,它是一个UI对象,根据用户输入与B-E交互 在任何给定时间只能有一个实例,以避免竞争条件、数据损坏等 提供a到B-E副本的最佳方式是什么?目前,F实例化A并在程序的生命周期中保持它,在创建它们时将其传递给B-E。或者,我可以创建一个全局可用的模块,其中包含一个所有东西都使用的共享副本。另一种选择是创建A的B-E子类,但这只违反了一个A的约束(因为每个子类都是它们自己的数据处理程序) 语言是

程序设计:

  • 类,它实现较低级别的数据处理
    • 类B-E,为a提供更高级别的接口以执行各种功能
      • 类F,它是一个UI对象,根据用户输入与B-E交互
在任何给定时间只能有一个实例,以避免竞争条件、数据损坏等

提供a到B-E副本的最佳方式是什么?目前,F实例化A并在程序的生命周期中保持它,在创建它们时将其传递给B-E。或者,我可以创建一个全局可用的模块,其中包含一个所有东西都使用的共享副本。另一种选择是创建A的B-E子类,但这只违反了一个A的约束(因为每个子类都是它们自己的数据处理程序)

语言是Python3,FWIW。

使用a而不是Singleton

>>> class Borg( object ):
...     __ss = {}
...     def __init__( self ):
...             self.__dict__ = self.__ss
...
>>> foo = Borg()
>>> foo.x = 1
>>> bar = Borg()
>>> bar.x
1
使用一个而不是一个单件

>>> class Borg( object ):
...     __ss = {}
...     def __init__( self ):
...             self.__dict__ = self.__ss
...
>>> foo = Borg()
>>> foo.x = 1
>>> bar = Borg()
>>> bar.x
1

使用模块技术如何,这要简单得多

在模块“A.py”中

在模块“B.py”中

两者都有一个实例a


对于其他类C、D、F等也可以这样做。使用模块技术如何,这要简单得多

在模块“A.py”中

在模块“B.py”中

两者都有一个实例a


其他C、D、F等类也可以这样做。所以我假设我会生成一个Borg的子类,然后是A的B-E子类?很好。@bk0:嗯,博格与其说是一个特定的类,不如说是一个设计模式;通过使每个实例的
\uuuuu dict\uuuuu
成为一个类变量(因此在实例之间共享),可以将
变成一个
(无论它是什么类)的“Borglike”。不要为此将
A
子类化;只要在任何时候创建一个新实例,它就会神奇地与所有其他实例共享状态。有趣。所以我假设我会生成一个Borg的子类,然后是A的B-E子类?很好。@bk0:嗯,博格与其说是一个特定的类,不如说是一个设计模式;通过使每个实例的
\uuuuu dict\uuuuu
成为一个类变量(因此在实例之间共享),可以将
变成一个
(无论它是什么类)的“Borglike”。不要为此将
A
子类化;只要在任何时候创建一个新实例,它就会神奇地与所有其他实例共享状态。使用“全局”会让我恶心。我已经用shared.py做了一些类似的事情,其中F分配了A的一个实例,B-E得到了这个实例。使用global会让我恶心。我已经用“shared.py”有效地做了类似的事情,其中F分配了A的一个实例,该实例由B-E获取。应该有人建议重载
\uuu new\uu
。这将是一种比所有
a
实例共享一个dict更有效的方法。应该有人建议重载
\uuu new\uuu
。这将是一种比让
a
的所有实例共享一个dict更有效的方法。
from A import a

class B(object):
   def __init__(self)
       global a
       self.a = a