Я создаю несколько классов для работы с именами файлов в различных типах общих файлов (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__, но большинство сообщений, которые я прочитал об этом, используют, чтобы отговорить его. Есть ли более приемлемый способ решения этой проблемы?
