Форум сайта python.su
23
есть такой класс
class Data(dict): def __init__(self): super().__init__() def load(self, path): if self: self.clear() if not os.path.isfile(path): raise FileNotFoundError( _FILE_ASSERT_TEMPLATE.format(path)) self.update(self.get_data(path)) def get_data(self, path): raise TypeError(_METHOD_ERROR_ASSERT_TEMPLATE.format(Data.get_data.__name__))
Отредактировано vrabey (Дек. 23, 2015 19:10:12)
Офлайн
24
class Data(dict): def __init__(self): super().__init__() def __new__(cls, *args, **kwargs): if not hasattr(cls, "get_data"): raise AttributeError("you need to implement get_data in" " {} class".format(cls.__name__)) if not hasattr(getattr(cls, "get_data"), "__call__"): raise AttributeError("get_data must be instance method") return super().__new__(cls, *args, **kwargs)
Офлайн
23
наверное не правильно объяснил
класс Data нужен что бы от него наследоваться
метод get_data в нём как раз определён для того что бы в классе наследнике его тоже определили обязательно.
class Data(dict): def __init__(self): super().__init__() def __new__(cls, *args, **kwargs): if not hasattr(cls, "get_data"): raise AttributeError("you need to implement get_data in" " {} class".format(cls.__name__)) if not hasattr(getattr(cls, "get_data"), "__call__"): raise AttributeError("get_data must be instance method") return super().__new__(cls, *args, **kwargs) def get_data(self): # возвращает объект словаря pass class JsonData(Data): def __init__(self): super().__init__() # должен быть переопределён метод get_data data = JsonData()
Офлайн
568
class Data(dict): def __init__(self): super().__init__() assert hasattr(self, "get_data")
Офлайн
23
FishHook
class Data(dict): def __init__(self): super().__init__() assert hasattr(self, “get_data”)
class Data(dict): def __init__(self): super().__init__() assert hasattr(self, "get_data") def load(self, path): # здесь исползуется get_data pass def get_data(self): # возвращает объект словаря pass class JsonData(Data): def __init__(self): super().__init__() d = JsonData()
Отредактировано vrabey (Дек. 23, 2015 19:03:12)
Офлайн
24
vrabey
наверное не правильно объяснилкласс Data нужен что бы от него наследоватьсяметод get_data в нём как раз определён для того что бы в классе наследнике его тоже определили обязательно.
class Data(dict): def __init__(self): super().__init__() def __new__(cls, *args, **kwargs): if not hasattr(cls, "get_data"): raise AttributeError("you need to implement get_data in" " {} class".format(cls.__name__)) if not hasattr(getattr(cls, "get_data"), "__call__"): raise AttributeError("get_data must be instance method") return super().__new__(cls, *args, **kwargs) def some_method(self): print(self.get_data()) class P(Data): def get_data(self): return 1 a = P() a.some_method() 1
Отредактировано ayb (Дек. 23, 2015 19:22:44)
Офлайн
23
идея была такая:
есть класс
import json class DataJson(dict): def __init__(self): super().__init__() def load(self, path): with open(path, "r") as obj: self.update(json.load(obj)) class Level: def __init__(self, data_obj, path): self.data = data_obj() self.data.load(path) if __name__ == '__main__': path = "path.json" level = Level(DataJson, path) print(level.data)
Офлайн
24
vrabey
но предположим что в будущем я буду использовать не json а например shelve хранилище
Офлайн
23
ayb
Зачем нужен неиспользуемый класс
vrabeyу них всё должно быть общее кроме способа получения настроек из файла
хотел сделать базовый класс с общими методами от которого можно было наследовать
ну например проверка isFile или если файл пуст …
Отредактировано vrabey (Дек. 23, 2015 20:19:53)
Офлайн
24
Я понимаю ситуацию так - Вы используете в программе класс который представляет работу с json хранилищем, затем ( как Вы пишите ) нужно будет использовать shelve хранилище. Если shelve будет ВМЕСТО json, то смысла выделять часть функционала в базовый класс нет. Если shelve будет использоваться ВМЕСТЕ с json, смысл есть. Вам показали как запретить наследникам инстанцироваться без реализации необходимых методов. Только базовый класс не должен реализовывать эти методы.
Офлайн