‘’’
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
‘’’
from typing import Optional
import attr
@attr.s
class Position:
longitude: float = attr.ib()
latitude: float = attr.ib()
address: Optional[str] = attr.ib(default=None)
@longitude.validator
def check_long(self, attribute, v):
if not (-180 <= v <= 180):
raise ValueError(f"Longitude was {v}, but must be in [-180, +180]")
@latitude.validator
def check_lat(self, attribute, v):
if not (-90 <= v <= 90):
raise ValueError(f"Latitude was {v}, but must be in [-90, +90]")
pos1 = Position(49.0127913, 8.4231381, “Parkstraße 17”)
pos2 = Position(42.1238762, 9.1649964)
def get_distance(p1: Position, p2: Position) -> float:
pass
通过把装饰器改成 @attr.s(frozen=True)来使这个类变得不可修改。
你也可以在构造器入参的时候自动执行代码。这被称为是 “转换”。
@attr.s
… class C(object):
… x = attr.ib(converter=int)
o = C(“1”)
o.x
Visual Studio Code 中对类型注解有很多的插件可以使用。
5. Dataclass
Dataclasses 在 PEP 557 中被加入 Python 3.7。它与 attrs 类似,但是被收录于标准库中。一个很重要的点是 dataclass 就是普通的类, 不过是其中保存大量的数据而已。
与 attrs 不同的是,dataclass 使用类型注解而非 attr.ib() 这样的注解。我认为这样大大提高了可读性。另外,由于现在对属性有了注解,编辑器的支持效果也更好了。
你可以很容易的利用装饰器 @dataclass(frozen=True) 使 dataclass 变成不可修改的——这与 attrs 类似。
from typing import Optional
from dataclasses import dataclass
@dataclass
class Position:
longitude: float
latitude: float
address: Optional[str] = None
pos1 = Position(49.0127913