Я хочу создать объект 'File', который возвращает объекты 'Line', когда вызывается метод ReadLine () вместо просто строк. Я также хочу иметь возможность инициализировать объект File либо строкой, содержащей абсолютный путь к текстовому документу, либо списком строк, и в любом случае результирующий экземпляр будет вести себя одинаково. Единственный способ выяснить, как это сделать, - обернуть объект File вокруг объекта FileDoc или FileList, в зависимости от типа ввода. Вот сокращенная версия решения, которое я имею до сих пор:
class Line(object):
def __init__(self, line, count, fpath):
self.text = line
self.count = count
self.fname = fpath.split('/')[-1]
class FileBase(object):
def __init__(self):
pass
def Open(self):
self.count = 0
def Readline(self):
pass
def Get_count(self):
return self.count
def Set_count(self, val):
self.count = val
class FileList(FileBase):
def __init__(self, lines):
self.lines = lines
self.Open()
def ReadLine(self):
self.count += 1
try:
return Line(line=self.lines[self.count - 1], count=self.count - 1, fpath='list')
except IndexError:
raise StopIteration
class FileDoc(FileBase):
def __init__(self, fpath):
self.fpath = fpath
self.Open()
def Open(self):
self.count = 0
self.file = open(self.fpath, 'r')
def ReadLine(self):
self.count += 1
return Line(line=self.file.next(), count=self.count - 1, fpath=self.fpath)
class File(FileBase):
def __init__(self, input):
if type(input) == type(''):
self.actual = FileDoc(input)
elif type(input) == type([]):
self.actual = FileList(input)
else:
raise NonRecognizedInputError
def Open(self):
self.actual.Open()
def ReadLine(self):
return self.actual.ReadLine()
def Get_count(self):
return self.actual.count
def Set_count(self, val):
self.actual.count = val
Однако это кажется неуклюжим и непифоническим, так как мне приходится использовать методы Get_count () и Set_count () для доступа к члену .count объекта File, вместо того, чтобы просто иметь доступ к нему напрямую с помощью instance.count , Есть ли более элегантное решение, которое позволило бы мне получить доступ к члену .count в качестве члена, а не с помощью методов получения и установки?
Кроме того, для получения бонусных баллов я все еще пытаюсь выяснить всю проблему наследования. Есть ли лучший способ структурировать отношения между классами?