【发布时间】:2023-03-18 07:05:01
【问题描述】:
我正在尝试编写一个类似于内置函数和我见过的其他一些“成熟”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)
【问题讨论】:
-
如果你
import Pythia,那是一个模块,而不是一个类。所以你不能做Pythia()。你可以在模块中有一个名为Pythia的类,也叫Pythia,在这种情况下你可以做Pythia.Pythia()。但是你最好通过调用模块pythia来避免混淆(正如 PEP8 建议的那样)。 -
还有一件事:
self.FileManger = FileManager()是一个非常糟糕的主意。将一个类和该类的实例命名为相同的东西肯定会导致混淆。 (如果你按照 Eevee 的建议遵循 PEP8,这甚至永远不会出现 -file_manager是通用FileManager实例的合理名称。但如果你不这样做,你需要一些其他风格来命名这些东西,比如 Apple-风格aFileManager.)
标签: python class inheritance