Итак, магия в том, как «свойство» работает в Python, реализована с использованием протокола дескриптора - самого свойства, если мощная встроенная функция, предоставляющая дескриптор, который хорошо работает для экземпляров, а не классов, как вы видели.
Итак, вам нужно «свойство класса» - встроенное свойство не может дать вам этого, но протокол дескриптора может.Протокол дескриптора говорит, что всякий раз, когда атрибут извлекается из класса, если это объект с методом __get__
, этот метод вызывается с помощью «self, instance, owner» - если он извлекается из класса, вместо этогоиз экземпляра у вас параметр "instance" равен None -
Btw, как указано @Constantinius, это вообще не имеет отношения к ABC, просто вам нужно "свойство класса".
class classproperty(object):
def __init__(self, func):
self.func = func
def __get__(self, instance, owner):
return self.func(owner)
class Entry(_DbObject):
_objectTypeID = 'ENTRY'
def _GetObjectType(cls):
return MyDatabaseModule.DoesSomethingWith(cls._objectTypeID)
ObjectType = classproperty(_GetObjectType, None)