为什么我不能像这样实现继承?

时间:2017-01-04 08:17:30

标签: python python-2.7

首先,我知道有一种正确的方法来实现这样的继承:

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'

这有什么问题?提前谢谢。

2 个答案:

答案 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的原因。