【发布时间】:2021-12-24 16:18:42
【问题描述】:
这是 Django deb 模型的简化重新实现。
这很有效(类似于 Django 所做的,虽然它是一个属性,而不是一个属性):
class ClassPropertyType(type):
@property
def objects(cls):
return cls.init_empty_storage_if_needed()
class Model(metaclass=ClassPropertyType):
@classmethod
def init_empty_storage_if_needed(cls):
if not hasattr(cls, "__objects_storage"):
cls.__objects_storage = ObjectStorage(cls)
return cls.__objects_storage
class ObjectStorage:
def __init__(self, model_class):
pass
def all(self):
pass
Model.objects.all()
这个:
class Model:
@classmethod
def init_empty_storage_if_needed(cls):
if not hasattr(cls, "__objects_storage"):
cls.__objects_storage = ObjectStorage(cls)
return cls.__objects_storage
@classmethod
@property
def objects(cls):
return cls.init_empty_storage_if_needed()
class ObjectStorage:
def __init__(self, model_class):
pass
def all(self):
pass
Model.objects.all()
给出一个例外:
Traceback (most recent call last):
File "classmethod_property.py", line 21, in <module>
Model.objects.all()
AttributeError: 'property' object has no attribute 'all'
我想使用更直观的@classmethod+@property 方式。如何让它做同样的事情?
【问题讨论】:
标签: python properties metaclass