Как заставить класс python иметь свойство CLASS? (не МОМЕНТАЛЬНАЯ собственность !!!) - PullRequest
0 голосов
/ 06 марта 2020

Я некоторое время гуглил, но все, что я получил, - это свойство INSTANCE , а не свойство CLASS . Например, это ответ с наибольшим количеством голосов для вопроса от stackoverflow

class C(ABC):
    @property
    @abstractmethod
    def my_abstract_property(self):
        return 'someValue'

class D(C)
    def my_abstract_property(self):
        return 'aValue'

class E(c)
   # I expect the subclass should have this assignment,
   # but how to enforce this?
   my_abstract_property = 'aValue'  

Однако это случай INSTANCE PROPERTY, а не мой случай CLASS PROPERTY. Другими словами, вызов
D.my_abstract_property вернет что-то вроде <unbound method D.my_abstract_property>. Возвращение 'aValue' - это то, что я ожидал, как класс E.

Ответы [ 3 ]

1 голос
/ 06 марта 2020

На основании вашего примера и комментария к моему предыдущему ответу я структурировал следующее, которое работает с ABC. :

from abc import ABC

class C(ABC):
    _myprop = None

    def __init__(self):
        assert self._myprop, "class._myprop should be set"

    @property
    def myprop(self):
        return self._myprop


class D(C):
    _myprop = None

    def __init__(self):
        super().__init__()


class E(C):
    _myprop = 'e'

    def __init__(self):
        super().__init__()


e = E()
print(e.myprop)

d = D()
print(d.myprop)

Вы правы, что нет предварительного сканирования Python, которое обнаружит, что другой разработчик не присвоил значение переменной класса перед инициализацией. Инициализатор позаботится об уведомлении довольно быстро при использовании.

0 голосов
/ 06 марта 2020

Я придумаю хитрый обходной путь.

class C(object):
    myProp = None
    def __init__(self):
        assert self.myProp, 'you should set class property "name"'

class D(C):

    def __init__(self):
        C.__init__(self)

class E(C):
    myProp = 'e'
    def __init__(self):
        C.__init__(self)

print(D.myProp)
print(E.myProp)

Но у него все еще есть некоторые проблемы:

  1. D.myProp не вызовет никаких исключений, чтобы предупредить разработчика о ограничение (назначая myProp как его свойство класса), пока разработчик не инициализирует экземпляр своего класса.
  2. ab c модуль не может работать с этим решением, что означает потерю множества полезных функций этого модуля
0 голосов
/ 06 марта 2020

Вы можете использовать @classmethod decorator.

...