我编写了一个程序,想要调用main中的函数。但是,我一直在收到一个SyntaxError。我不确定我做错了什么。这是我的代码,我尝试了一些东西,但主函数不会调用其余的函数。
class Matrix(object):
def open_file():
'''Opens the file if it exists, otherwise prints out error message'''
Done = False
while not Done:
try:
File = input("Enter a filename: ").lower() #Asks user for a file to input
Open_File = open(File, "r") #Open the file if it exists and reads it
Info = Open_File.readlines()[1:]
Open_File.close() #Close the file
Done = True #Exits the while loop
except FileNotFoundError:
print("Sorry that file doesn't exist!") #prints out error message if file doesn't exist
return Info #Info is the file_pointer(fp)
def __init__(self): # This completed method is given
'''Create and initialize your class attributes.'''
self._matrix = {} #Intialize the matrix
self._rooms = 0 #Set the rooms equal to zero
def read_file(self, Info): #Info is equvalient to the file pointer or fp
'''Build an adjacency matrix that you read from a file fp.'''
self._rooms = Info.readline()
self._rooms = int(self._rooms)
for line in Info:
a, b = map(int, line.split())
self._matrix.setdefault(a, set()).add(b)
self._matrix.setdefault(b, set()).add(a)
return self._rooms and self._matrix
def __str__(self):
'''Return the adjacency matrix as a string.'''
s = str(self._matrix)
return s #__str__ always returns a string
def main(self):
matrix = Matrix()
info = matrix.open_file()
matrix.read_file(info)
s = str(matrix)
print(s)
if __name__ == '__main__':
m = Matrix()
m.main()
答案 0 :(得分:1)
一些事情:
self.read_file
,而不只是read_file
。这是一种实例方法,因此您需要使用self
。__init__(self)
相同,您需要致电self.__init__
。虽然通常不会手动执行此操作。您可以通过Matrix()
“实例化”课程。open_file() = Info
根本没有意义。也许你的意思是info = open_file()
。看起来你对如何布置班级感到有点困惑。尝试离开课程的main
,就像这样(未经测试):
def main:
matrix = Matrix()
info = matrix.open_file()
matrix.read_file(info)
s = str(matrix)
print(s)
您还需要将if __name__ == '__main__'
置于全球范围内。
答案 1 :(得分:0)
您的计划条目中有错误。 '如果名称 ==' 主要':'不应包含在班级中。它应该是全球性的。另外,你想调用Matrix的成员函数,但Matrix的对象在哪里。以下代码是正确的:
Class Matrix(object):
#################
your codes
#################
if __name__ == '__main__':
m = Matrix()
m.main()
答案 2 :(得分:0)
理想情况下,您可能想要写下面的内容。此外,您的open_file()必须重写。
class Matrix(object):
def open_file(self):
File = input("Enter a filename: ").lower() #Asks user for a file to input
fp = open(File, "r")
return fp
#### Your matrix class code goes here
def main():
myMatrix = Matrix()
fp = myMatrix.open_file()
ret = myMatrix.read_file(fp)
print(myMatrix)
if __name__ == "__main__":
main()
答案 3 :(得分:0)
发布方式
if __name__ == "__main__":
main()
将在定义类时执行 - 而不是在程序运行时执行。如上所述,该类将不会被实例化,因此没有Matrix
对象可以调用main()
。
您需要将调用移出一个缩进,因此它与类定义对齐,然后在调用其main()
之前创建一个对象:
if __name__ == "__main__":
instance = Matrix()
instance.main()
你还在main()
中向后收到了作业。它应该更像这样:
info = open_file()
self.read_file(Info)
s = __str__(self)
print(s)
open_file()
方法也存在一些问题。你想在你的循环范围之外创建Info
,这样你就知道你已经让它返回了。你的评论表明Info
应该是文件指针 - 但它并不像你写的那样。 Open_File
是文件指针,Info
是文件的内容(至少除了第一行之外的所有内容)。除非您期望获得大量数据,否则传递内容可能更容易 - 或者将open_file
和read_file
组合到同一个函数中。
您还希望使用常用的python模式来打开和关闭with
上下文管理器 - 这将为您关闭文件的文件。
在一个包中加入了Open_file
和Read_file
的快速而脏的版本。
def read_file(self):
#get the filename first
filename = None
while not filename:
user_fn = input("Enter a filename: ").lower()
if os.path.exists(user_fn):
filename = user_fn
else:
print ("Sorry that file doesn't exist!")
# 'with' will automatically close the file for you
with open(filename, 'rt') as filepointer:
# file objects are iterable:
for line in filepointer:
a, b = map(int, line.split())
self._matrix.setdefault(a, set()).add(b)
self._matrix.setdefault(b, set()).add(a)
我不清楚self._matrix.setdefault(a, set()).add(b)
在这里应该为你做些什么,但在句法术语中你可以简单地将结构“获取文件名,用with
打开,迭代它”