我创建了一个python代码,其中Apple是父类,而Macbook是子类。 如下所述,我无法从mackbookpro实例调用background()函数。 出现错误:AttributeError:“ Macbook”对象没有属性“ year_builted”。
如果我从__init__
函数中声明 year_founded ,则效果很好。
为什么我不能在子组件实例处获取父构造函数中提到的数据?
class Apple:
# year_established=1976 --code run successfully if I declare value here
# -- but I commented out
def __init__(self):
self.year_established=1976
def background(self):
return ('it is established in {}'.format(self.year_established))
class Macbook(Apple):
def __init__(self):
self.price = 10000
def productdetails(self):
return (str(self.price) + self.background())
macbookpro = Macbook()
print(macbookpro.productdetails())
答案 0 :(得分:2)
您需要将父类初始化器调用到子类初始化器,例如:
class Apple:
def __init__(self):
self.year_established = 1976
def background(self):
return ('it is established in {}'.format(self.year_established))
class Macbook(Apple):
def __init__(self):
super().__init__()
self.price = 10000
def productdetails(self):
return (str(self.price) + self.background())
macbookpro = Macbook()
print(macbookpro.productdetails())
答案 1 :(得分:1)
使用由Base-Class (or iterface) / Inherit-Class
插入的Child / Parent
,它将描述本示例中的类的“所有权”
class Apple:
def __init__(self, parent=None):
self.parent = parent
class Macbook(Apple):
def __init__(self, **kwargs):
super(Macbook, self).__init__(**kwargs)
macbookpro = Macbook()
macbookpro_child = Macbook(parent=macbookpro)
当类继承基并且在基类中已经存在方法而不会更改该方法时,super()
方法在python中产生的原因是该方法将不会更改,在其他语言中,这是不同的,因为它会覆盖de基本类忽略了重复。
要解决此问题,超级调用原始方法,并且可以在__init__()
中的任何时候完成此操作,请注意,从基类中放置的任何方法都具有超级。
(需要传递self来给出超级执行哪个类的上下文)
嘲笑旧的超级方法可能会更直观
class Macbook(Apple):
def __init__(self):
Apple.__init__(self)
这是带有超级代码的代码
class Apple:
def __init__(self):
self.year_established = 1976
def background(self):
return 'it is established in {}'.format(self.year_established)
class Macbook(Apple):
def __init__(self):
super(Macbook, self).__init__()
self.price = 10000
def product_details(self):
return str(self.price) + self.background()
macbookpro = Macbook()
print(macbookpro.product_details())