python3.7 的dataclass新特性大大简化了定义类对象的代码量,代码简洁明晰。通过使用@dataclass装饰器来修饰类的设计,例如
from dataclasses import dataclass
@dataclass
class DataClassCard:
rank: str
suit: str
#生成实例
queen_of_hearts = DataClassCard('Q', 'Hearts')
print(queen_of_hearts.rank)
print(queen_of_hearts)
print(queen_of_hearts == DataClassCard('Q', 'Hearts'))
运行结果
Q
DataClassCard(rank='Q', suit='Hearts')
True
而常规的类,按照3.7之前的语法类似于这样
class RegularCard
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
虽然这种写法并没有使用更多的代码量,但是我们很容易看到为了初始化,仅仅只是为了初始化一个对象,rank和suit已经重复了三次。此外,如果你试图使用这个RegularCard类,你会注意到对象的表示不是很具描述性,并且已有的类与新声明的类是无法比较是否相同的。因为每次声明都会使用一个新的内存地址,而“==”不止比较类存储的信息,还比较内存地址是否相同。
具体请看下面代码
queen_of_hearts = RegularCard('Q', 'Hearts')
print(queen_of_hearts.rank)
print(queen_of_hearts)
print(queen_of_hearts == RegularCard('Q', 'Hearts'))
运行结果
'Q'
False
dataclass还在底层给我们做了更多的有用的封装。默认情况下dataclass实现了repr方法,可以很好的提供字符串表示;也是了eq方法,可以做基本的对象比较。而如果RegularCard想实现上面的功能需要写大量的声明,代码量多的吓人
class RegularCard(object):
def __init__(self, rank, suit):