我正在创建用于记录历史记录的软件。从本质上讲,这将是一个很大的时间表,因此您可以输入任何人,地点或事物以及日期,并将所有内容组织到一个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, *args, id='default', start_date=None, end_date=None, loc='default', author='Jane Doe'):
super().__init__(self, *args, 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:], id=id, start_date=start_date, end_date=end_date, loc=loc)
产生这个:
>>> var.facts
[<objects.Book object at 0x0000017ADA3D8160>, ('There is a captain',)]
我不知道如何删除该论点。有人帮我,我很笨。
答案 0 :(得分:3)
通过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()
super().__init__(*args, id=id, start_date=start_date, end_date=end_date, loc=loc)