【发布时间】:2018-11-06 02:09:48
【问题描述】:
我正在努力学习和理解如何在 Python 中使用 super,我一直在关注“Python 从新手到专家的旅程”一书,尽管我觉得我理解了这个概念,但我在自己的代码中执行 super 时遇到了问题。
例如,这个方法对我有用:
class Employee:
def __init__(self, firstname, lastname, age, sex, dob):
self.firstname = firstname
self.lastname = lastname
self.age = age
self.sex = sex
self.dob = dob
self.all_staff.append(self)
class Hourly(Employee):
def __init__(self, firstname, lastname, age, sex, dob, rate, hours):
self.rate = rate
self.hours = hours
super().__init__(firstname, lastname, age, sex, dob)
def __str__(self):
return "{} {}\nAge: {}\nSex: {}\nDOB: {}\n".format(self.firstname, self.lastname, self.age,
self.sex, self.dob)
def get_rate(self):
print('The hourly rate of {} is {} '.format(self.firstname, self.rate))
hourlystaff1 = Hourly('Bob', 'Foo', '23', 'M', '12/1/1980', '$15', '30')
print(hourlystaff1)
print(hourlystaff1.get_rate())
返回以下内容:
Bob Foo
Age: 23
Sex: M
DOB: 12/1/1980
The hourly rate of Bob is $15
None
这是我的预期(我不确定为什么还会返回“无”,也许有人可以解释一下?)。
然后我想尝试使用 super 但使用 **kwargs 像这样:
class Employee:
def __init__(self, firstname='', lastname='', age='', dob='', **kwargs):
super().__init__(**kwargs)
self.firstname = firstname
self.lastname = lastname
self.age = age
self.dob = dob
class Hourly(Employee):
def __init__(self, rate=''):
self.rate = rate
super().__init__(**kwargs)
def __str__(self):
return "{} {}\nAge: {}\nSex: {}".format(self.firstname, self.lastname, self.age,
self.sex, self.dob, self.rate)
def get_rate(self):
print('The hourly rate of {} is {} '.format(self.firstname, self.rate))
bob = Hourly('Bob', 'Bar', '23', '12/1/2019')
bob.get_rate('$12')
返回此错误:
File "staff_b.py", line 33, in <module>
bob = Hourly('Bob', 'Bar', '23', '12/1/2019')
TypeError: __init__() takes from 1 to 2 positional arguments but 5 were given
我在第二种方法中做错了什么?如何在这里正确使用 **kwargs 和 super?
编辑:
这是我一直在关注的书中示例的屏幕截图:
我在第二个示例中使用 **kwargs 和 super 的方式有什么不同?
这也是来自同一本书和同一章的综合案例研究。这对我有用,我理解它是如何工作的,但我似乎无法将其转化为我自己的作品。
【问题讨论】:
-
至于
None,那是因为你的get_rate方法没有返回任何东西。见How is returning the output of a function different from printing it?。至于**kwargs:你放错地方了。它们应该在Hourly.__init__方法中使用。Employee不应该调用super().__init__(**kwargs)或super().__init__()或任何类似的东西。 -
从
Employee中删除它们并添加到Hourly:def __init__(self, rate='', **kwargs): -
啊,这是因为您将它们作为位置参数而不是关键字参数传递。您可以将所有
**kwargs更改为*args, **kwargs。但请注意,您将'Bob'作为rate参数的值传递,所以也许您应该只使用关键字参数来避免犯这样的错误。 -
啊,我想我明白你在说什么了。书中的类是为多重继承而设计的。 (您可以看到
Friend继承自Contact和AddressHolder。)您可能会发现我的回答here 很有用。 -
我不确定我是否应该这样做。您的代码中有很多单独的小问题,可能有点过于宽泛,不适合 StackOverflow。
标签: python python-3.x multiple-inheritance super