首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用文件中的数据初始化类实例的pythonic方法是什么?

使用文件中的数据初始化类实例的pythonic方法是什么?
EN

Stack Overflow用户
提问于 2021-07-21 20:37:56
回答 1查看 44关注 0票数 1

一般来说,我是OOP和Python的新手,遇到了以下问题:假设我有一个文件,其中逐行包含我想用来创建类实例的数据。处理文件、初始化实例和存储它们的最典型的方式是什么?我有3个替代方法: CASE-1: class方法逐行处理整个文件,创建实例并将它们存储在列表CASE-2中。CASE-2:类外函数执行与CASE-1case-3相同的操作:类外函数单独处理每一行,以及main中的for循环,例如:

代码语言:javascript
复制
    class TestClass:
    all_instances_1 = []

    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

#CASE-1
    @classmethod
    def from_file(cls, input_file):
        my_file = open(input_file, "r")
        for line in my_file:
            var1, var2 = line.split(',')
            new_instance = TestClass(var1, var2])
            cls.all_instances_1.append(new_instance)
        my_file.close()

#CASE-2
def outside_class_init(input_file):
    all_instances_2 = []
    my_file = open(input_file, "r")
    for line in my_file:
        var1, var2 = line.split(',')
        new_instance = TestClass(var1, var2])
        all_instances_2.append(new_instance)
    my_file.close()
    return all_instances_2

#CASE-3
def one_by_one(my_str):
    var1, var2 = line.split(',')
    new_instance = TestClass(var1, var2])
    return new_instance

def main():
    filename = "$FILE"
    TestClass.from_file(filename)
    instances_list2 = outside_class_init(thefile)

    all_instances_3 = []
    my_file = open(thefile, "r")
    for line in my_file:
        all_instances_3.append(one_by_one(line))
    my_file.close()


if __name__ == '__main__':
    main()

如果它们都不是真正的好方法,你会如何处理呢?提前谢谢你

EN

回答 1

Stack Overflow用户

发布于 2021-07-21 21:09:50

TestClass结合了两个不同的抽象:单个值对的表示和这些值对的集合。应该有两个单独的类。下面是一个例子:

代码语言:javascript
复制
class Pair:
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

    @classmethod
    def from_string(cls, s):
        v1, v2 = s.split(",")
        return cls(v1, v2)


class LotsaPairs:
    def __init__(self, pairs):
        self.pairs = pairs

    @classmethod
    def from_file(cls, f):
        return cls([Pair.from_string(line.strip()) for line in f])


def main():
    filename = "$FILE"
    with open(filename) as f:
        all_instances = LotsaPairs.from_file(f)

以下是一些观察结果:

这两个类中的

  1. __init__都是“哑巴”;它所做的就是用给定的参数初始化属性。

为了计算__init__.所需的值,

  1. 类方法负责从特定的源“提取”数据

  1. LotsaPairs.from_file接受一个类似文件的对象,而不是文件名。让调用者提供该对象,以便进行测试。(例如,您可以传递一个io.StringIO实例。)

  1. LotsaPairs是一个围绕列表的美化包装器。你可以省去它,用一个函数来代替它:

def get_pairs(f):返回f中行的Pairs.from_string(line.strip())

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68469616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档