Как заставить мой шаблонный наблюдатель с метаклассом работать? - PullRequest
0 голосов
/ 07 октября 2019

Я хочу установить шаблон наблюдателя в свойстве класса

Я пытаюсь использовать @classmethod, но у него нет свойства setter.

class dataframe():
    df = None
    @classmethod
    @property
    def weather(cls):
        return cls.df
    @classmethod
    @weather.setter
    def weather(cls,value):
        cls.df= value
        print("the weath was change {}".format(cls.df))
<ipython-input-119-7e26ac08cb26> in dataframe()
      6         return cls.df
      7     @classmethod
----> 8     @weather.setter
      9     def weather(cls,value):
     10         cls.df= value

AttributeError: 'classmethod' object has no attribute 'setter'

Затем я попытался адаптировать найденное там решение к моей проблеме Использование свойства () для методов класса

class dataframe_meta(type):
    def __init__(cls, *args, **kwargs):
        cls.df = None

    @property
    def change(cls):
        return cls.df

    @change.setter
    def change(cls, value):
        cls.df = value
        print("the weath was change {}".format(cls.df))

class dataframe(metaclass=dataframe_meta):
    pass

dataframe.df = 5 Этоне возвращает никаких ошибок, но print из установщика функций не отображался.

Как заставить его работать правильно?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Если вы хотите просмотреть изменения, внесенные в свойство df, вам следует назвать метод df и присвоить атрибуту, который хранит фактическое значение df, что-то еще, например _df:

class dataframe_meta(type):    
    def __init__(cls, *args, **kwargs):
        cls._df = None

    @property
    def df(cls):
        return cls._df

    @df.setter
    def df(cls,value):
        cls._df= value
        print("the weath was change {}".format(cls._df))
0 голосов
/ 07 октября 2019

Код, который вы разместили,


class dataframe_meta(type):
    def __init__(cls, *args, **kwargs):
        cls.df = None

    @property
    def change(cls):
        return cls.df

    @change.setter
    def change(cls, value):
        cls.df = value
        print("the weath was change {}".format(cls.df))

class dataframe(metaclass=dataframe_meta):
    pass

будет работать как есть - однако вы назвали свойство change, а не df - если вы сделаете dataframe.change = 5, вы увидите печать.

Однако сам доступ к dataframe.df не защищен.

Если вы хотите, чтобы сам dataframe.df вызывал методы получения / установки, вам нужно присвоить имя самому свойству df и сохранитьрезультат в атрибуте с другим именем. И да, метаклассы - это простой способ для «свойства» работать с атрибутами класса.

...