Python中的数据类 |第 4 组(继承)
先决条件: Python中的继承、 Python中的数据类 |设置 3
在这篇文章中,我们将讨论继承时 DataClass 的行为方式。尽管它们创建了自己的构造函数,但 DataClass 的行为方式与普通类在继承时的行为方式几乎相同。
from dataclasses import dataclass
@dataclass
class Article:
title: str
content: str
author: str
@dataclass
class GfgArticle(Article):
language: str
author: str
upvotes: int = 0
上面代码的几点:
-
Article
由GfgArticle
子分类 - 超类和子类都是数据类——尽管超类或子类是普通类也是可能的。当 DataClass 继承一个普通类时,超类的 __init__() 在子类中被覆盖。
- GfgArticle 中的
author
重写 Article 中的相同——作为继承的基本概念,它的赋值首先在子类中查找,然后在超类中查找树。
GfgArticle 的 __init__() 的行为:
- 如果 __init__() 没有显式提供,默认的 __init__() 需要超类(文章)的属性,然后是子类的属性作为参数。
GfgArticle(title: str, content: str, author: str, language: str, upvotes: int = 0)
注意:尽管GfgArticle中的声明顺序相反,但签名希望
author
在language
之前。这是因为属性是从超类到子类从上到下扫描的。因此,首先在Article中扫描author
,然后在GfgArticle中扫描language
。dClassObj = GfgArticle("DataClass", "SuperCool DataStructure", "vibhu4agarwal", "Python3") print(dClassObj)
输出:
GfgArticle(title=’DataClass’, content=’SuperCool DataStructure’, author=’vibhu4agarwal’, language=’Python3′, upvotes=0)
- 如果 __init__() 被显式提供,它应该以某种方式初始化它自己的所有属性以及超类中的属性(文章)。
from dataclasses import dataclass @dataclass class Article: title: str content: str author: str @dataclass(init = False) class GfgArticle(Article): language: str author: str upvotes: int = 0 def __init__(self, title): self.title = title self.language = "Python3" self.author = "vibhu4agarwal" self.content = "Inheritance Concepts" dClassObj = GfgArticle("DataClass") print(dClassObj)
输出:
GfgArticle(title=’DataClass’, content=’Inheritance Concepts’, author=’vibhu4agarwal’, language=’Python3′, upvotes=0)
笔记:
- __init__() 中的参数要求可以根据需要进行调整,只要它有某种方式初始化所有属性即可。
- 初始化顺序无关紧要。
language
在author
之前初始化,而content
最后初始化并且它仍然有效。