我正在尝试通过加载文本文件并使用其中的一些字符串作为输入来创建类的实例。
这应该从电影手稿中吐出所有场景标题,并在每次读取以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)
答案 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)