Model和Storage

Model类

我们把符合以下规定的类称为Model类:
- __init__方法支持无参数的实例化
- 至少有一个标注了类型的非私有成员。私有成员定义为下划线(_)开头的成员。
- 如果有@property成员,则必须同时定义一个下划线(_)开头的、标注了类型的私有成员。

例如:

import math

class Circle:
    radius: float
    color: str
    _other: int
    _area: float

    @property
    def area(self) -> float:
        return math.pi * self.radius ** 2

Storage类

Storage类是dict的子类,由框架自带。Storage类重写了__getattr__, __setattr____delattr__等方法,使得可以像操作对象一样操作字典。例如:

>>> from lessweb import Storage
>>> a = Storage()
>>> a.x = 1
>>> print(a['x'])
1

Storage类更重要的作用是获取Model类的成员列表,以及实现与Model类之间的互相转化。

Storage类实现了这3个方法:

# 获取Model类的成员列表,结果的key是成员名称,value是成员的类型
@staticmethod
def type_hints(cls: Type) -> 'Storage': ...

# 获取Model对象的成员列表,结果的key是成员名称,value是成员的值
@staticmethod
def of(obj) -> 'Storage': ...

# 把Storage对象转化为指定的Model类型的对象
def to(self, cls: Type[T]) -> T: ...

注意type_hintsto都是静态方法,且结果中都不包含私有成员。

用法示例:

>>> print(Storage.type_hints(Circle))
<Storage {'radius': <class 'float'>, 'color': <class 'str'>, 'area': <class 'float'>}>
>>> circle = Storage(radius=2.0).to(Circle)
>>> circle.radius, circle.area
(2.0, 12.566370614359172)
>>> print(Storage.of(circle))
<Storage {'radius': 2.0, 'area': 12.566370614359172}>