如何在Python中将* args与类继承一起使用?

问题描述

我正在创建用于记录历史记录的软件。从本质上讲,这将是一个很大的时间表,因此您可以输入任何人,地点或事物以及日期,并将所有内容组织到一个txt文件中。 “注释”类是放置在时间轴中的所有信息的父级。此类采用以下参数:self,* args,id ='default',start_date ='iso_date',end_date ='iso_date',loc ='some location'。 我正在使用“ * args”,以便您可以输入有关给定项目的任意数量的信息。 \ nEx:

class Note(object):
    def __init__(self,*args,id="default",start_date=None,end_date=None,loc="default"):
        if start_date: start_date = date.fromisoformat(start_date)
        if end_date: end_date = date.fromisoformat(end_date)
        self.id = id.title()
        self.facts = [f for f in args]
        self.loc = loc

这是如此简单,我无法打破它。当我专门为书籍创建子类时,就会出现问题。

class Book(Note):
    def __init__(self,id='default',loc='default',author='Jane Doe'):
        super().__init__(self,id=id,start_date=start_date,end_date=end_date,loc=loc)
        self.author = author

我必须在这里使用super函数,以便像往常一样进行初始化,但是我仍然可以创建一个新的变量“ author”。这就是问题所在。

PS C:\Users\Max\projects\hist\Hist> py                                        Python 3.7.2 (tags/v3.7.2:9a3ffc0492,Dec 23 2018,23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help","copyright","credits" or "license" for more information.
>>> from objects import Book
>>>
>>> var = Book("It's about a whale.","There is a captain.",id="Moby Dick",start_date="1851-10-18",loc="Pittsfield,Massachusetts")
>>>
>>> var.id
'Moby Dick'
>>>
>>> var.loc
'Pittsfield,Massachusetts'
>>>
>>> var.author
'Herman Melville'
>>>
>>> var.facts
[<objects.Book object at 0x0000010E08708160>,"It's about a whale.",'There is a captain.']
>>>

以某种方式,超级功能将子类作为一个有意义的参数,但是我没有深入研究所有文档来找到解决该问题的方法。我尝试使用

super().__init__(self,args[1:],loc=loc)

产生这个:

>>> var.facts
[<objects.Book object at 0x0000017ADA3D8160>,('There is a captain',)]

我不知道如何删除该论点。有人帮我,我很笨。

解决方法

通过super()调用父类构造函数时,请注意__init__方法已经是bound。因此,像调用任何其他绑定方法一样,self部分是隐式传递的,不需要是显式参数。

智慧:

class Parent: 
    pass                                                                         

class Child(Parent): 
    def __init__(self): 
        print(super().__init__.__self__) 

c = Child()  
# prints <__main__.Child object at 0x105116e48>

通常,您的代码可能因参数数量上的某种TypeError而失败,但是由于您拥有*args并且没有类型验证所有args必须是字符串,因此很高兴地当传递给超类时,额外的self作为事实

TL; DR 只是在调用super()

时删除了显式的self arg。
super().__init__(*args,id=id,start_date=start_date,end_date=end_date,loc=loc)