首先,我知道有一种正确的方法来实现这样的继承:
class Parent():
def __init__(self, last_name, eye_color):
self.last_name = last_name
self.eye_color = eye_color
class Child(Parent):
def __init__(self, last_name, eye_color, number_of_toys):
Parent.__init__(self, last_name, eye_color)
self.number_of_toys = number_of_toys
miley_cyrus = Child("Cyrus", "Blue", 5)
print(miley_cyrus.last_name)
print(miley_cyrus.number_of_toys)
当我运行这段代码时,结果是
Cyrus
5
然而,当我将第7行更改为:
时self = Parent(last_name, eye_color)
并且代码变为:
class Parent():
def __init__(self, last_name, eye_color):
self.last_name = last_name
self.eye_color = eye_color
class Child(Parent):
def __init__(self, last_name, eye_color, number_of_toys):
self = Parent(last_name, eye_color)
self.number_of_toys = number_of_toys
miley_cyrus = Child("Cyrus", "Blue", 5)
print(miley_cyrus.last_name)
print(miley_cyrus.number_of_toys)
,我运行这段代码,有一个错误表明:
Traceback (most recent call last):
File "/Users/Echo/Documents/IT/Udacity/python/7.Inheritance/inherentance.py", line 12, in <module>
print(miley_cyrus.last_name)
AttributeError: Child instance has no attribute 'last_name'
这有什么问题?提前谢谢。
答案 0 :(得分:3)
我不确定你在做什么,但你可以通过这种方式获得预期的结果。
class Parent():
def __init__(self, last_name, eye_color):
self.last_name = last_name
self.eye_color = eye_color
class Child(Parent):
def __init__(self, last_name, eye_color, number_of_toys):
self.obj = Parent(last_name, eye_color)
self.number_of_toys = number_of_toys
miley_cyrus = Child("Cyrus", "Blue", 5)
print(miley_cyrus.obj.last_name)
print(miley_cyrus.number_of_toys)
self = Parent
应为self.some_variable = Parent
答案 1 :(得分:1)
我认为这一点的答案并没有真正解决实际问题。在我的解释中,您认为self
是某种可以手动更改的上下文。
您是否知道,self
确实是您正在创建的实例?重新分配它不仅会令人困惑,而且会出错 - 尽管分配参数是不可能的。
您可以执行这段代码,向您显示您试图将miley_cyrus
变为Parent
初始化程序内的Child
:
class Parent(object):
def __init__(self, last_name, eye_color):
self.last_name = last_name
self.eye_color = eye_color
class Child(Parent):
def __init__(self, last_name, eye_color, number_of_toys):
# hex(id(self)) -> 0x7fe2325a7da0
self.number_of_toys = number_of_toys
miley_cyrus = Child("Cyrus", "Blue", 5) # hex(id(miley_cyrus)) -> 0x7fe2325a7da0
此外,我认为术语初始化程序在这里非常重要,因为您可能会对传统语言感到困惑。 Python有一个单独的魔术方法,负责实际创建对象(__new__
)。在调用__init__
时 - 您已经在实例化对象上操作。这就是__new__
采用类对象而不是self
的原因。