我想創建一個'File'對象,當調用ReadLine()方法而不是僅字符串時,它返回'Line'對象。我還希望能夠使用包含文本文檔的絕對路徑的字符串或字符串列表來初始化File對象,並使得結果實例在任一情況下都具有相同的行爲。我可以想出如何做到這一點的唯一方法是根據輸入類型將File對象包裝到FileDoc或FileList對象周圍。這裏是解決方案的簡化版本我到目前爲止有:我該如何編寫一個類似其他動態確定類的類? (Python)
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
然而,這似乎笨重和不Python的,因爲我必須使用Get_count()和Set_count()方法來訪問的.Count中成員File對象,而不是直接使用instance.count訪問它。有沒有更優雅的解決方案,可以讓我作爲成員訪問.count成員,而不是使用getter和setter?
此外,對於獎勵積分,我仍然試圖找出整個繼承的事情。有沒有更好的方法來構建類之間的關係?
而不是爲每個可能的輸入創建一個類,爲什麼不將這兩種類型轉換爲init中的單個對象類型(如字符串列表)? –
這聽起來很像你試圖重塑已經存在的功能。你知道'iter(file(「foo.txt」))'每次從foo.txt返回一行嗎?你知道StringIO模塊提供了一個將字符串轉換爲文件類對象的包裝器嗎?你真的想要解決什麼問題? – SingleNegationElimination