Я создаю несколько классов для работы с именами файлов в различных типах общих файлов (nfs, afp, s3, локальный диск) и т.д. Я получаю, как пользователь вводит строку, которая идентифицирует источник данных (т.е. "nfs://192.168.1.3"
или "s3://mybucket/data"
) и т.д.
Я подклассифицирую определенные файловые системы из базового класса с общим кодом. Там, где я запутался, в создании объекта. У меня есть следующее:
import os
class FileSystem(object):
class NoAccess(Exception):
pass
def __new__(cls,path):
if cls is FileSystem:
if path.upper().startswith('NFS://'):
return super(FileSystem,cls).__new__(Nfs)
else:
return super(FileSystem,cls).__new__(LocalDrive)
else:
return super(FileSystem,cls).__new__(cls,path)
def count_files(self):
raise NotImplementedError
class Nfs(FileSystem):
def __init__ (self,path):
pass
def count_files(self):
pass
class LocalDrive(FileSystem):
def __init__(self,path):
if not os.access(path, os.R_OK):
raise FileSystem.NoAccess('Cannot read directory')
self.path = path
def count_files(self):
return len([x for x in os.listdir(self.path) if os.path.isfile(os.path.join(self.path, x))])
data1 = FileSystem('nfs://192.168.1.18')
data2 = FileSystem('/var/log')
print type(data1)
print type(data2)
print data2.count_files()
Я думал, что это будет полезно использовать __new__
, но большинство сообщений, которые я прочитал об этом, используют, чтобы отговорить его. Есть ли более приемлемый способ решения этой проблемы?