提问人:Turducken 提问时间:9/7/2023 更新时间:9/7/2023 访问量:39
Python 继承问题
Python inheritance issues
问:
我有一个类 Person,其中包含许多属性,其中一个是库存属性:
class Person:
def __init__(self):
#Private Attributes
self._inventory = []
我有一个子类 Male,它继承自 Person 类:
class Male(Person):
def __init__(self, *args, **kwargs):
super(Person, self).__init__()
Person 类内部是一个 HasItem 方法:
def HasItem(self, key):
item = next(filter(lambda x: key in x.Key, self._inventory), None)
if (not item == None):
if (item.Quantity == 0):
self._inventory.remove(next(filter(lambda x: item.Key in x.Key, self._inventory)))
return False
else:
return True
else:
return False
我还有一个名为 NPC 的类,它将 Person 对象作为参数:
class NPC():
def __init__(self, person, *args, **kwargs):
self._person = person
@property
def Person(self):
return self._person
因此,我实例化了NPC的实例:
npc = NPC(Male(Person()))
然后打电话给 NPC。Person.HasItem(“Key”),此时我收到一个错误,说“'Male'对象没有属性'_inventory'”
由于 Male 继承自 Person,而 HasItem 方法位于 Person 中,因此我希望它使用 Person 的self._inventory。然而,它似乎希望 Male 也具有一种属性self._inventory这将使整个继承点变得毫无用处。那么我在这里做错了什么?
答:
1赞
Mohil Patel
9/7/2023
#1
问题出在类方法上。超级接受子类名称,而不是父类名称和对象。
可能的修复:Male
__init__
class Male(Person):
def __init__(self, *args, **kwargs):
super(Male, self).__init__()
或
class Male(Person):
def __init__(self, *args, **kwargs):
super().__init__()
评论
super
采用当前类,而不是父类(或者在 Python 3 中,您可以省略参数)。