私は、ビルトインや、私が見た他の「成長した」Pythonのもののように機能するクラスを作成しようとしています。私のPythonic教育は、クラスごとに少しむらがあり、すべてが混乱しているのではないかと心配しています.
未処理ファイル (およびその名前) の辞書と処理済みファイル (およびそれらの名前) の辞書を含む一種のリポジトリとして機能するクラスを作成したいと思います。ファイルのオープンや処理などを処理する他の (サブ?) クラスをいくつか実装したいと思います。ファイル処理クラスは、メイン クラスの辞書を更新できる必要があります。また、すべてを個別にインスタンス化することなく、さまざまなサブモジュールを直接呼び出すことができるようにしたいと考えています。
import Pythia
p = Pythia()
p.FileManager.addFile("/path/to/some/file")
あるいは
Pythia.FileManager.addFile("/path/to/some/file")
などといろいろ調べているのですが、完全に理解できている@classmethod
とsuper
は言えません。また、継承のチェーン全体が後方にあるのではないかと疑い始めています。つまり、メイン クラスと考えているものは、実際には、処理クラスと処理クラスの子クラスであるべきです。また、これがすべてパッケージとしてうまく機能するかどうかも疑問に思っていますが、それは別の、非常に恐ろしい問題です.
これまでの私のコードは次のとおりです。
#!/usr/bin/python
import re
import os
class Pythia(object):
def __init__(self):
self.raw_files = {}
self.parsed_files = {}
self.FileManger = FileManager()
def listf(self,fname,f):
if fname in self.raw_files.keys():
_isRaw = "raw"
elif fname in self.parsed_files.keys():
_isRaw = "parsed"
else:
return "Error: invalid file"
print "{} ({}):{}...".format(fname,_isRaw,f[:100])
def listRaw(self,n=None):
max = n or len(self.raw_files.items())
for item in self.raw_files.items()[:max]:
listf(item[0],item[1])
def listParsed(self,n=None):
max = n or len(self.parsed_files.items())
for item in self.parsed_files.items()[:max]:
listf(item[0],item[1])
class FileManager(Pythia):
def __init__(self):
pass
def addFile(self,f,name=None,recurse=True,*args):
if name:
fname = name
else:
fname = ".".join(os.path.basename(f).split(".")[:-1])
if os.path.exists(f):
if not os.path.isdir(f):
with open(f) as fil:
Pythia.raw_files[fname] = fil.read()
else:
print "{} seems to be a directory.".format(f)
if recurse == False:
return "Stopping..."
elif recurse == True:
print "Recursively navingating directory {}".format(f)
addFiles(dir,*args)
else:
recurse = raw_input("Recursively navigate through directory {}? (Y/n)".format(f))
if recurse[0].lower() == "n":
return "Stopping..."
else:
addFiles(dir,*args)
else:
print "Error: file or directory not found at {}".format(f)
def addFiles(self,directory=None,*args):
if directory:
self._recursivelyOpen(directory)
def argHandler(arg):
if isinstance(arg,str):
self._recursivelyOpen(arg)
elif isinstance(arg,tuple):
self.addFile(arg[0],arg[1])
else:
print "Warning: {} is not a valid argument...skipping..."
pass
for arg in args:
if not isinstance(arg,(str,dict)):
if len(arg) > 2:
for subArg in arg:
argHandler(subArg)
else:
argHandler(arg)
elif isinstance(arg,dict):
for item in arg.items():
argHandler(item)
else:
argHandler(arg)
def _recursivelyOpen(self,f):
if os.path.isdir(f):
l = [os.path.join(f,x) for x in os.listdir(f) if x[0] != "."]
for x in l:
_recursivelyOpen(x)
else:
addFile(f)