【问题标题】:Python dataclass with inheritance: __init__() missing 1 required positional argument具有继承性的 Python 数据类:__init__() 缺少 1 个必需的位置参数
【发布时间】:2022-12-12 22:45:47
【问题描述】:

尝试使用数据类继承(Python 3.9.13)。

鉴于以下情况:

from dataclasses import dataclass
from datetime import datetime


@dataclass()
class BookMetadata():
    '''Parent class.'''
    
    isbn: str 
    title: str 
    author: str
    publisher: str
    date_published: int
    

    def __post_init__(self):
        '''Change attributes after assignment.'''
            
        # Change date from UNIX to YYYY-MM-DD HH:MM:SS
        self.date_published = datetime.fromtimestamp(int(str(self.date_published))).strftime('%Y-%m-%d %H:%M:%S')
      

@dataclass()
class RetailPrice(BookMetadata):
    '''Child class.'''
    
    def __init__(self, 
                 isbn, title, author, publisher, date_published,
                 price_usd, price_aud, price_eur, price_gbp) -> None:
        
        BookMetadata.__init__(isbn, title, author, publisher, date_published)
        
        self.price_usd: float = price_usd
        self.price_aud: float = price_aud
        self.price_eur: float = price_eur
        self.price_gbp: float = price_gbp

以及这样分配的值:

book1 = RetailPrice(isbn='1234-5678-9000', 
                    title='My book', 
                    author='Name Surname', 
                    publisher='My publisher',
                    date_published=1670536799, 
                    price_usd=17.99, 
                    price_aud=23.99, 
                    price_eur=15.99, 
                    price_gbp=16.99)

我得到一个TypeError:TypeError: __init__() missing 1 required positional argument: 'date_published',但这是在作业中提供的。

这是因为父类没有__init__吗?

PS:这是我尝试重现下图中的第 21 行,必须使用数据类而不是常规类:

【问题讨论】:

    标签: python oop inheritance python-dataclasses


    【解决方案1】:

    由于您使用的是 BookMetadata 的子类,您可以使用 super() 从子类初始化超类 -

    
    @dataclass()
    class RetailPrice(BookMetadata):
        '''Child class.'''
        
        def __init__(self, 
                     isbn, title, author, publisher, date_published,
                     price_usd, price_aud, price_eur, price_gbp) -> None:
            super().__init__(isbn, title, author, publisher, date_published)
            self.price_usd: float = price_usd
            self.price_aud: float = price_aud
            self.price_eur: float = price_eur
            self.price_gbp: float = price_gbp
    

    原始代码中错误的原因是因为缺少BookMetadata.__init__() 的 self 参数,因为您没有 BookMetadata 类的实例,所以缺少一个参数(self + 5 个附加参数,所以它是在最后一个缺少的参数上给出错误date_published)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多