Tworzę klasy do radzenia sobie z nazwami plików w różnych typach udziałów plików (nfs, afp, s3, dysk lokalny). Otrzymuję jako dane wejściowe ciąg znaków identyfikujący źródło danych (np. "nfs://192.168.1.3"
lub "s3://mybucket/data"
) itp.Niewłaściwe użycie __new__ do generowania klas?
Jestem podklasy konkretnych systemów plików z klasy bazowej, która ma wspólny kod. Gdzie jestem zdezorientowany jest w tworzeniu obiektu. To, co mam jest następujące:
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()
myślałem, że to będzie dobre wykorzystanie __new__
ale większość stanowisk czytałem o nim używają go zniechęcić. Czy istnieje bardziej akceptowany sposób podejścia do tego problemu?
Proszę poprawić wcięcie. To Python, to ma znaczenie. –
Czy możesz wyjaśnić dalej, co masz nadzieję osiągnąć, używając __new __() w ten sposób? –
Wyedytowałem użycie 'pre' i' code'. Nie jestem pewien, czy to ty, czy redaktor, ale zepsuło to białą czcionkę. – TankorSmash