使用Python类在Python脚本之间共享数据

时间:2017-12-18 21:15:03

标签: python python-3.x oop

我想知道在Python中使用包含列表的类是否有意义,就好像它是一个内存数据库。

class MyData(object):
    def __init__(self):
        self._data = ['apple', 'orange', 'banana']

    @property
    def data(self):
        return self._data

    @classmethod
    def append(self, item):
        self._data.append(item)

以下是该方案:

第一个python脚本a.py将导入此类MyData并使用其列表中的数据。

第二个python脚本b.py在无限循环中连续轮询在线API,导入同一个类并将更多项添加到列表中。

a.py再次运行时,它应该能够读取列表中新添加的项目。

问题:这是一个好主意,还是我们最好使用像MySQL / redis这样的真实数据库?

更新:数据不需要保存到磁盘

3 个答案:

答案 0 :(得分:1)

这对你描述它的方式不起作用。 a.pyb.py将运行不同的python解释器,因此不共享内存(即他们不会共享该类)。

答案 1 :(得分:1)

如果想法是关于在不同的python进程上运行a.py和b.py,你需要使用进程间通信或类似的方法将数据保存在磁盘上的某个地方......我最好的建议是什么?只使用你的数据库中的一些zillion python模块,允许你与它进行通信,这就是它们的用途。

现在,如果问题是关于在模块之间共享对象状态,这里有一个简单的例子,它向您展示如何实现:

<强> storage.py:

class Storage(object):

    def __init__(self):
        self._data = ['apple', 'orange', 'banana']

    @property
    def data(self):
        return self._data

    def append(self, item):
        self._data.append(item)

Storage = MyData()

<强> a.py:

from storage import Storage


class A():

    def __init__(self):
        self.count = 0

    def __str__(self):
        self.count += 1
        return f"read count={self.count} data={','.join(Storage.data)}"

<强> b.py:

from storage import Storage


class B():

    def __init__(self):
        self.count = 0

    def write(self, item):
        Storage.append(item)

<强> test.py:

from a import A
from b import B

if __name__ == "__main__":
    reader = A()
    writer = B()

    print(f"Initial state of storage {reader}")
    for i, item in enumerate(["pomegranate", "watermelon", "strawberry"]):
        writer.write(item)
        print(reader)

有关此主题的更多信息,您可以查看此Is there a simple, elegant way to define singletons?或类似于线程,讨论python和单片。

答案 2 :(得分:1)

假设a.py无需输出任何其他内容,您可以通过print输出您需要传输的数据,例如:

#a.py
for i in range(6):
    print("data:{}".format(i))

然后通过将输出汇总到b.pyinput可以使用raw_input#b.py try: while True: data = input() print("recieved data:", repr(data)) except EOFError: #raised when input stream is closed print("data stopped coming") 和python2)接收输入

|

然后,您可以在命令提示符中使用Tadhgs-MacBook-Pro:codes Tadhg$ python3 a.py | python3 b.py recieved data: 'data:0' recieved data: 'data:1' recieved data: 'data:2' recieved data: 'data:3' recieved data: 'data:4' recieved data: 'data:5' data stopped coming 一起运行它们来管道数据:

$options = json_decode(<<<JSON
{
    "0" : { "classcat": "a" },
    "13": { "classcat": "b" },
    "20": { "classcat": "c" },
    "45": { "classcat": "d" },
    "53": { "classcat": "e" }
}
JSON
, true);