问题:
所以我有下一个问题。我不明白如何正确地写出所有课程。我写了解决方案,但有错误(下面的代码)。 我的问题是:如何正确编写所有类?
并推荐给我一本关于OOP的好书。)
class FactoryRader:
def __init__(self, fileName,frmt=None):
self.frmt = frmt
self.fileName = fileName
def __str__(self):
return Reader.openFile(self.fileName, self.frmt)
class Reader:
def openFile(fileName, frmt):
try:
with open(fileName, 'rU') as data:
if fileName.endswith('.csv') or frmt == 'csv':
return CSVReader.reader(data)
if fileName.endswith('.xml') or frmt == 'xml':
return XMLReader()
if fileName.endswith('.js') or (frmt == 'json' or frmt == 'js'):
return JSONReader()
else:
return 'Incorrect File!'
except IOError:
print('Cant open')
def reader(data):
pass
class CSVReader(Reader):
def reader(data):
dialect = csv.Sniffer().sniff(data.readline(), [',',';'])
data.seek(0)
reader = csv.DictReader(data, dialect=dialect)
for row in reader:
print (row)
class JSONReader(Reader):
def reader(data):
pass
class XMLReader(Reader):
def reader(data):
pass
if __name__ == '__main__':
data = FactoryRader('CsvExamples/price.csv')
print(data)
错误
Traceback (most recent call last):
File "ClassParsers.py", line 62, in <module>
print(data)
TypeError: __str__ returned non-string (type NoneType)
答案 0 :(得分:0)
这绝不是一个完整的解决方案;这只是一堆言论。
据我所知,Reader中的try / except块应该在FactoryReader中。 Python中没有抽象类这样的东西,所以你的类Reader可能是空的。或者,如果您愿意,只需
class Reader:
def reader(data):
pass
(如果您使用的是Python2,最好使用新的样式类:class Reader(object)
)。
要求FactoryReader返回字典,而不是字符串,因此__str__
函数并不重要。你得到的错误是告诉你FactoryReader中的__str__
方法应该返回一个字符串。最好不要实现__str__
并为该函数使用其他名称;说get_reader
。然后,您应该以dict方式返回数据。所以它会是
def get_reader(self):
if self.fileName.endswith('.csv') or self.frmt == 'csv':
return CSVReader(self.filename)
etc
然后,
class CSVReader(Reader):
def reader(filename):
code to open filename, read it and parse it
code to convert parsed code into dict
return dict
同样适用于JSONReader
和XMLReader
。