Python全系列 教程
3567个小节阅读:5930.1k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
为了支持数据修改, 默认值, 比较等功能。更加好一些的方法是:使用自定义类来实现数据类。
xxxxxxxxxx
class Player:
def __init__(self,name:str,number:int,postion:str,age:int = 18) -> None:
self.name = name
self.number = number
self.postion = postion
self.age = age
def __repr__(self) -> str:
return f'Player: {self.name} {self.number}'
def __eq__(self, __o: object) -> bool:
return self.age == __o.age
def __gt__(self,__o: object) ->bool:
return self.age > __o.age
p1 = Player('SXT',18,'PG',26)
print(p1)
缺点
__init__
方法中重复代码 (示例中每个属性都需要写3遍)需要自己实现
__repr__
方法, 和比较方法__eq__
,__gt__
等
dataclass 可以认为是提供了一个简写__init__
方法的语法糖,类型注释是必填项 (不限制数据类型时, 添加typing.Any为类型注释), 默认值的传递方式和__init__
方法的参数格式一致。
xxxxxxxxxx
from dataclasses import dataclass
from typing import ClassVar
@dataclass
class Player:
name:str
number:int
postion:str
age:int
p1 = Player('SXT',18,'PG',26)
print(p1)
优点
可以使用 dataclasses 模块中的其它方法,比如:
转为字典 asdict
转为元组 astuple
dataclass
装饰器将根据类属性生成数据类和数据类需要的方法。
xxxxxxxxxx
dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
key | 含义 |
---|---|
init | 指定是否自动生成__init__ ,如果已经有定义同名方法则忽略这个值,也就是指定为True也不会自动生成 |
repr | 同init,指定是否自动生成__repr__ ;自动生成的打印格式为class_name(arrt1:value1, attr2:value2, ...) |
eq | 同init,指定是否生成__eq__ ;自动生成的方法将按属性在类内定义时的顺序逐个比较,全部的值相同才会返回True |
order | 自动生成__lt__ ,__le__ ,__gt__ ,__ge__ ,比较方式与eq相同;如果order指定为True而eq指定为False,将引发ValueError ;如果已经定义同名函数,将引发TypeError |
unsafehash | 如果是False,将根据eq和frozen参数来生成__hash__ : 1. eq和frozen都为True, __hash__ 将会生成 2. eq为True而frozen为False, __hash__ 被设为None 3. eq为False,frozen为True, __hash__ 将使用超类(object)的同名属性(通常就是基于对象id的hash) 当设置为True时将会根据类属性自动生成__hash__ ,然而这是不安全的,因为这些属性是默认可变的,这会导致hash的不一致,所以除非能保证对象属性不可随意改变,否则应该谨慎地设置该参数为True |
frozen | 设为True时对field赋值将会引发错误,对象将是不可变的,如果已经定义了__setattr__ 和__delattr__ 将会引发TypeError |
可以通过dataclass.filed
方法设置变量的额外功能
defualt:设置默认值
值为具体的值
default_factory:设置默认值
值为类型名,程序会根据类型名创建一个空的对象,若使用defualt设置需要手动创建空对象
repr设置生成的__repr__
方法中是否加入此属性,默认是True
xxxxxxxxxx
from dataclasses import dataclass
@dataclass
class Player:
name:str
number:int
postion:str
age:int=field(default=19,repr=False)
# 引用类型可以通过default_factory初始化参数
country:str= field(default_factory=str) # country:str= field(default='')
在类中建立变量,默认是成员变量,若需要设置类变量,需要设置类型为:ClassVar
xxxxxxxxxx
from dataclasses import dataclass
from typing import ClassVar
@dataclass
class Player:
name:str
number:int
postion:str
age:int
country:ClassVar[str]
p1 = Player('SXT',18,'PG',26)
print(p1)
实时学习反馈
1. _______装饰器将根据类属性生成数据类和数据类需要的方法。
A dataclass
B class
2. dataclass建立类变量,需要设置类型为_____:
A Class
B ClassVar
C classVar
答案
1=>A 2=>B