【问题标题】:What is best practice when it comes to storing instances of a class in python when re-running code?在重新运行代码时,在 python 中存储类的实例时,最佳实践是什么?
【发布时间】:2020-01-15 06:58:34
【问题描述】:

假设我有以下代码:

import pandas as pd
import cx_Oracle

class Foo:

    instances = []

    def __init__(self, id, name):
        self.id = id
        self.name = name

        dsn_tns = cx_Oracle.makedsn('***', '***', service_name='***')
        conn = cx_Oracle.connect(user=r'***', password='***', dsn=***)

        self.data = pd.read_sql(***, conn)
        conn.close()

        Foo.instances.append(self)

    def method1(...):
        ...

    def method2(...):
        ...


one = Foo(1, 'one')

我创建一个类并初始化该类的一个(或可能更多)实例。

在这种情况下,我从 Oracle 服务器导入一些数据,这需要很长时间才能运行 SQL 查询。

假设我在我的对象上运行 method1:

one.method1...

运行此语句后,我决定要在其中一个上使用方法 2:

one.method2...

现在我将不得不再次运行代码,它必须将一个重新初始化为 Foo 类的实例,这将强制 SQL 查询重新运行,这需要时间。它还会在一个也可能需要很长时间的方法上重新运行 method1。

我是初学者,所以我想知道最好的解决方法是什么?

类似于将一个存储在内存中,因此当我重新运行代码时,它不必再次初始化并将该方法直接应用于内存中的对象?

还有一种方法可以存储method1的潜在输出,所以当我运行时

one.method1
one.method2

如果之前已经运行过one.method1,则不必重新执行。

显然,这对于运行速度很快的东西来说不是问题,而是在一个类中有许多方法和许多对​​象以及许多类等的代码上。我可以想象这会变得不堪重负。

我确信确实存在解决方案和最佳做法,但我正在努力寻找有关此问题的帮助。

我怀疑这是所有 OOP 的普遍现象,而不仅仅是 python。

谢谢。

【问题讨论】:

  • 删除Foo.instances.append(self) 使self.data 成为class variable 并运行所有oracle 依赖条件仅在第一次时间。例如if not Foo.data: ...

标签: python python-3.x oop methods


【解决方案1】:

原则上,内存连接到您的 Python 程序(例如,请参阅 this answer 和此线程以获取可能的解决方案)。

如果文件可用,最简单的方法是腌制您的对象并取消腌制它。请参阅Python documentation 了解更多信息。

【讨论】:

    【解决方案2】:

    如果您在调用其中一个方法时避免更改类实例的数据,您可以简单地运行任何一个方法,one 不会有任何变化。这很明显。

    如果你调用的方法确实改变了你类的一些成员变量,你可以复制一个实例:

    import copy
    
    ...
    one = Foo(1, 'one')
    one_bak = copy.copy(one)
    one.method1
    one = one_bak
    one.method2
    

    【讨论】:

    • 但是你还是要初始化一个。你说one = Foo(1, 'one') 所以每次我运行这个我仍然需要初始化一个,对吗?这正是我想了解的如何避免。
    • 如果您想从 Foo() 类中获得一个实例,并且为了构造该实例,则需要 SQL 查询。是的,您必须至少初始化一次one。您可以考虑让 Foo() “懒惰”并根据请求启动 SQL 查询。
    • 您说我必须至少初始化一次one,但是您的代码不会在每次运行代码时都初始化它吗?需要明确的是,我只想初始化一次,然后能够根据需要对数据应用方法,而无需重新初始化。
    • 在这种情况下,您需要序列化和存储您的对象。查看@Syzmon Maszke 的回答
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 2017-12-21
    • 2011-05-27
    • 2013-10-09
    • 2017-02-20
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多