自动创建类

时间:2016-08-13 23:35:51

标签: python

我正在尝试通过加载文本文件并使用其中的一些字符串作为输入来创建类的实例。

这应该从电影手稿中吐出所有场景标题,并在每次读取以INT或EXT开头为特征的场景标题时创建一个Scene类的实例。

虽然它确实找到了所有场景,但我在创建实际实例时遇到了麻烦。

如何在create函数中创建Class实例,然后将它们打印出来?

class Scene(object):
    def __init__(self, name, isint, isday):
        self.name = name
        self.isint = bool(isint)
        self.isday = bool(isday)

    def create(self):
        with open('output.txt', 'r') as searchfile:
             for line in searchfile:
                if 'INT' in line or 'EXT' in line:
                    return Scene()
                if line.startswith(INT):
                    Scene.isint == True
                if line.endswith('NAT\n'):
                    Scene.isday == False

    def __repr__(self):
        print(self)

1 个答案:

答案 0 :(得分:0)

你的函数不应该是Scene的方法,因为除了创建一堆对象之外它实际上什么都不做。您可以在解析文件时使用生成器发出Scene个实例:

def read_scenes(filename):
    with open(filename, 'r') as handle:
        scene = Scene(None, None, None)

        for line in handle:
            if line.startswith('INT'):
                scene.isint = True

            if line.endswith('NAT\n'):
                scene.isday = False

            if 'INT' in line or 'EXT' in line:
                # Spit out the current scene
                yield scene

                # Create a new one
                scene = Scene(None, None, None)

for scene in read_scenes('output.txt'):
    print(scene)

原始回答

您的create函数是一种实例方法,因此它要求您先创建一个类的实例,然后调用create方法。如果你考虑它,这有点倒退,因为你的create方法不应该需要类的实例,因为它应该是创建实例的那个。

解决方案是将create方法设为class method。实例方法将类的实例作为第一个参数,而类方法接受类本身,让您使用不同的函数创建类的实例。

class Scene(object):
    def __init__(self, name, isint, isday):
        self.name = name
        self.isint = bool(isint)
        self.isday = bool(isday)

    @classmethod
    def from_file(cls, filename, name):
        isint = None
        isday = None

        with open(filename, 'r') as searchfile:
             for line in searchfile:
                if 'INT' in line or 'EXT' in line:
                    return cls(name, isint, isday)

                if line.startswith(INT):
                    isint = True

                if line.endswith('NAT\n'):
                    isday = False

由于该函数是一个类方法,因此您不需要Scene类的实例来调用它:

scene = Scene.from_file('output.txt', 'The Name')

这相当于做了类似的事情:

name, isint, isday = parse_scene_file('output.txt')
scene = Scene(name, isint, isday)