📜  Python中的数据类 |第 4 组(继承)

📅  最后修改于: 2022-05-13 01:55:25.344000             🧑  作者: Mango

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

上面代码的几点:

  1. ArticleGfgArticle子分类
  2. 超类和子类都是数据类——尽管超类或子类是普通类也是可能的。当 DataClass 继承一个普通类时,超类的 __init__() 在子类中被覆盖。
  3. GfgArticle 中的author重写 Article 中的相同——作为继承的基本概念,它的赋值首先在子类中查找,然后在超类中查找树。

GfgArticle 的 __init__() 的行为:

  • 如果 __init__() 没有显式提供,默认的 __init__() 需要超类(文章)的属性,然后是子类的属性作为参数。

    注意:尽管GfgArticle中的声明顺序相反,但签名希望authorlanguage之前。这是因为属性是从超类到子类从上到下扫描的。因此,首先在Article中扫描author ,然后在GfgArticle中扫描language

    dClassObj = GfgArticle("DataClass",
                           "SuperCool DataStructure",
                           "vibhu4agarwal",
                           "Python3")
    print(dClassObj)
    

    输出:

  • 如果 __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)
    

输出:

笔记:

  • __init__() 中的参数要求可以根据需要进行调整,只要它有某种方式初始化所有属性即可。
  • 初始化顺序无关紧要。 languageauthor之前初始化,而content最后初始化并且它仍然有效。