Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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_Architecture - Fatal编程技术网

Python类作为服务

Python类作为服务,python,architecture,Python,Architecture,一个将被视为服务的类的良好设计是什么:它从磁盘上的大数据初始化,然后响应另一个模块的请求 它可以仅仅是静态数据类吗?通过调用Init函数从磁盘加载数据,然后可以对该类发出请求 你能批评一下这个解决方案吗?您有更好的建议吗?根据您的描述,我知道您建议将磁盘上的所有数据读取到类实例或类似实例的成员中(如果您正计划这样做,我不会使用模块全局变量),然后使用这些数据响应请求-我理解正确了吗 只要你在系统上有足够的内存,这种方法就可以很好地工作——因为我不知道你的数据有多大,我不能评论这是否现实。但是,您

一个将被视为服务的类的良好设计是什么:它从磁盘上的大数据初始化,然后响应另一个模块的请求

它可以仅仅是静态数据类吗?通过调用Init函数从磁盘加载数据,然后可以对该类发出请求


你能批评一下这个解决方案吗?您有更好的建议吗?

根据您的描述,我知道您建议将磁盘上的所有数据读取到类实例或类似实例的成员中(如果您正计划这样做,我不会使用模块全局变量),然后使用这些数据响应请求-我理解正确了吗

只要你在系统上有足够的内存,这种方法就可以很好地工作——因为我不知道你的数据有多大,我不能评论这是否现实。但是,您对代码施加了可伸缩性限制,因此如果数据变得更大,那么您就有可能让代码运行得非常慢或导致崩溃。不同的平台对内存耗尽的反应略有不同,但结果几乎总是令人不快

在可能的情况下,最好按需从磁盘读取数据,如果合适的话,可以使用一些内存缓存。如果可以的话,我建议您将数据转换为结构化格式,这是创建结构化文件数据的一种相当简单的方法。然后,您可以编写执行SQL查询的方法,以便根据需要从文件中恢复数据

如果需要通过在内存中缓存公共结果来获得更好的性能,那么可以在所有要缓存的函数中使用类似于Python3的decorator的东西。这确实假设函数的结果只依赖于它的参数。如果您使用的是Python2.x,那么您可以在标准库中找到

如果结果依赖于类成员和函数参数,则可能需要做一些额外的工作,或者编写自己的缓存层,或者使用上述解决方案,并在适当的类成员发生更改时手动清除缓存。如果我不知道更多关于你的问题的信息,我就不能给你具体的信息,但希望这能涵盖所涉及的问题

这回答了你的问题,还是我没有抓住重点?如果您需要不同的答案,请提供澄清

编辑

在你下面的评论之后,我想我应该补充一点澄清

首先,我不太清楚“静态”数据是什么意思——Python并没有像C/C++或Java这样的概念。您可以拥有存储在类对象中的类属性,这些类属性对实例可用,就像它们是常规属性一样:

class MyClass(object):

    class_attribute = 123

    def method(self):
        print "Class attribute value: %d" % (self.class_attribute,)
。。。但在这种情况下,我认为这不是一个好主意。也许“静态”只是指存储为类实例属性的一组数据,如果是这样的话,那么对于您所描述的内容来说,这似乎是一个非常明智的选择

因此,您的类将以一个
\uuuuu init\uuuuu()
方法结束,该方法可能会将类似文件名的内容作为参数(即使存储数据的文件现在已修复,将来也可能不会修复,而且在单元测试中使用不同的文件可能会很有用)。然后,此方法将导致加载数据并将其存储为实例属性。我建议将实际加载委托给另一个方法,这样您就可以在不必构造新实例的情况下重新加载数据

举个简单的例子,如果您的类存储文件中的行,那么您可能有:

class FileLines(object):

    def __init__(self, filename):
        self.lines = []
        self.load_file(filename)

    def load_file(self, filename):
        with open(filename, "r") as fd:
            self.lines = [i.rstrip() for i in fd]
(我意识到在
\uuu init\uuu()
中设置
并不是严格要求的,因为它在
加载文件()
中被重置,但我认为初始化
\uu init\uu()
中的所有属性是一个好的做法)

这显然是一个毫无意义的类,但您可以从
\uuuu init\uuuu()
读取数据,然后使其可用。顺便说一句,我没有特意为
属性添加“getter”方法-在Python中,直接访问属性是完全可以接受的,不需要C/C++和Java中常见的“getter”和“setter”方法。这是因为如果以后需要实现更复杂的功能,可以在Python中使用方法替换简单属性。因此,您现在可以拥有基本属性的简单性,以后也可以具有灵活性

此外,假设您的数据具有结构,您应该考虑如何存储它。字典、列表和集合在Python中都非常强大,但是如果您的数据已经命名为字段,那么考虑使用或自定义类来表示它。这使得类的用户访问它更加方便(因此不容易出错)。理想情况下,我建议尝试将对象的内存中表示形式保留在一个类中,并让代码在其他地方解析磁盘上表示形式,从而生成内存中版本的实例。以这种方式保持表示分离将允许您将类的用户与磁盘表示的更改隔离开来


希望这能有所帮助。

谢谢你的回答!是的,你正确地理解了我。看起来我可以把所有的数据读入内存,大数据本身在这里不是问题。这个问题更多的是关于类的架构。它应该包含静态数据吗?它应该有Init方法吗?如果你用几行代码把它画出来,你会更容易对你的想法发表评论。