Python增强提案PEP
Python 增强提案PEP
PEP 557 数据类(data class)
1.相比普通class,dataclass通常不包含私有属性,数据可以直接访问
2.dataclass的repr方法通常有固定格式,会打印出类型名以及属性名和它的值
3.dataclass拥有__eq__和__hash__魔法方法
4.dataclass有着模式单一固定的构造方式,或是需要重载运算符,而普通class通常无需这些工作
# -*- coding: utf-8 -*
import random
from typing import List
from dataclasses import dataclass
from dataclasses import field
# dataclasses.field 接受了一个名为 default_factory 的参数,它的作用是:如果在创建对象时没有赋值,则使用该方法初始化该字段。
# default_factory 必须是一个可以调用的无参数方法(通常为一个函数)
def get_random_marks():
return [random.randint(1, 10) for _ in range(5)]
@dataclass(order=True)
class Student:
marks: List[int] = field(default_factory=get_random_marks)
name: str = field(default='noname', compare=False)
age: int = field(default=18, repr=False)
# 在追踪一个对象的状态,并且希望它在初始化时一直被设为False
# 更一般地,这个值在初始化时不能够被传递,init决定是否生成init
verified: bool = field(repr=False, init=False, default=False)
# 不好的方式:自定义比较方法
# 正确方式:
# dataclass能够自动生成 <, =, >, <= 和 >= 这些比较方法。但是这些比较方法的一个缺陷是,
# 它们使用类中的所有字段进行比较, 并且是按定义顺序
# 这里使用(order=True),把不需要的字段定义为 filed(compare=False)
# def __eq__(self, other):
# return (self.marks, self.name) == (other.marks, other.name)
# 不好的方法:初始化一个变量为列表, 使用__post_init__方法, 或参数传递
# 正确方式是使用field
# def __post_init__(self):
# self.marks = get_random_marks()
# 不要自己定义,会自动生成的__repr__方法使用所有的字段用于表示
# 不需要的元素使用field(repr=False)过滤
# def __repr__(self):
# return self.name+' '+' '.join(self.marks)
student_1 = Student([random.randint(1, 10) for _ in range(5)], 'tom', 17)
student_2 = Student(age=16, name='Rick')
# 这里会报异常
# student_3 = Student(verified=True)
print(student_1)
print(f'student_1 == student_2: {student_1 == student_2}')
# 使用dataclasses.asdict和dataclasses.astuple我们可以把数据类实例中的数据转换成字典或者元组:
from dataclasses import asdict, astuple
print(asdict(student_2))
# 使用dataclasses.is_dataclass可以判断一个类或实例对象是否是数据类:
print(f'isinstance(student_1, Student): {isinstance(student_1, Student)}')
>>>
Student(marks=[7, 6, 7, 2, 3], name='tom')
student_1 == student_2: False
{'marks': [6, 4, 3, 5, 1], 'name': 'Rick', 'age': 16, 'verified': False}
isinstance(student_1, Student): Truekey
含义
最后更新于
