数据类dataclass和nametuple
很多时候我们需要定义一个数据结构需要储存映射关系,例如我们现在遇到一个场景要存储rgb三色的数值数据
- dict
Color = {'r': 255, 'g': 255, 'b': 255}
def print_color(color_info):
print(f"颜色r值为{color_info.get('r')}")
print(f"颜色g值为{color_info.get('g')}")
print(f"颜色b值为{color_info.get('b')}")
当我们要用到的时候可以通过get方法获取到里面的rgb对应的值,但是你会发现这种方法有一个很大的缺陷,当你项目大的时候,你不知道color_info里面有什么key,你不知道要给print_color传入怎么样的字典数据。
- turple
Color = (255, 255, 255)
def print_color(color_info):
print(f"颜色r值为{color_info[0]}")
print(f"颜色g值为{color_info[1]}")
print(f"颜色b值为{color_info[2]}")
用元祖的方式缺陷更明显,我们咋知道第一个元素是r,第二个元素是g,第三个元素是b,甚至可能会出现元祖取值越界的错误
- 基础类
class Color:
def __init__(self, r: float, g: float, b: float):
self.r = r
self.g = g
self.b = b
def print_color(color_info:Color):
print(f"颜色r值为{color_info.r}")
print(f"颜色g值为{color_info.g}")
print(f"颜色b值为{color_info.b}")
我们可以定义一个基础类,实例化一个对象,并且用typehint说明它是Color类,我们在使用时pycharm会有提示,这种方法可以很好的维护,调用者也知道要传入什么对象,但是不够简洁,并且python的类属性是存储在
__dict__
里面的,底层数据结构是dict,空间复杂度比较大
- NameTuple
from typing import NamedTuple
class Color(NamedTuple):
r: float
g: float
b: float
def print_color(color_info:Color):
print(f"颜色r值为{color_info.r}")
print(f"颜色g值为{color_info.g}")
print(f"颜色b值为{color_info.b}")
使用NamedTuple的方式,并且用typehint说明它是Color类,我们在使用时pycharm会有提示,这种方法优于前三种
- dataclass
@dataclass
class Color:
r: float
g: float
b: float
def print_color(color_info:Color):
print(f"颜色r值为{color_info.r}")
print(f"颜色g值为{color_info.g}")
print(f"颜色b值为{color_info.b}")
使用dataclass方法,和NameTuple一样,这种方式也能很好的解决问题