Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承中Python类对象的创建_Python_Python 2.7 - Fatal编程技术网

继承中Python类对象的创建

继承中Python类对象的创建,python,python-2.7,Python,Python 2.7,我有以下python类: class Foo(): def __init__(self): self.id=8 self.value=self.get_value() #Mark-1 def get_value(self): pass def should_destroy_earth(self): return self.id ==42 class Baz(Foo): def get_value(s

我有以下python类:

class Foo():
    def __init__(self):
        self.id=8
        self.value=self.get_value() #Mark-1
    def get_value(self):
        pass
    def should_destroy_earth(self):
        return self.id ==42

class Baz(Foo):
    def get_value(self,some_new_parameter):
        pass
在这里,我可以创建一个Foo类的对象,如下所示:

ob1=Foo()#成功

但是,如果我尝试创建Baz的对象,它会抛出一个错误:

Ob2=Baz()#错误

文件“classespyton.py”,第20行,在
ob2=Baz()
文件“classespyton.py”,第4行,在_init中__
self.value=self.get_value()
TypeError:get_value()正好接受2个参数(给定1个)
如果我删除Foo类第3行中的“self.get_value”,我就可以创建Baz类的对象

当我们在python中继承一个类时,超类的init方法不是由子类继承的,我们需要显式地调用它们(例如超类。init(self))


因此,当我创建Baz的对象时,Foo()类的_init__方法在默认情况下不会被调用。那么为什么我不能为Baz创建对象呢

不,你有一些基本的误解。
Foo
\uuuuu init\uuuu
方法当然是由
Baz
继承的


Python将假定您希望子类使用相同的
\uuuu init\uuu
实现,因为您没有实现任何其他功能。如果不希望出现这种行为,您必须在
Baz
中自己明确定义它

不,你有一些基本的误解。
Foo
\uuuuu init\uuuu
方法当然是由
Baz
继承的

Python将假定您希望子类使用相同的
\uuuu init\uuu
实现,因为您没有实现任何其他功能。如果不希望出现这种行为,您必须在
Baz
中自己明确定义它

当我们在python中继承一个类时,init 超类的方法不是由子类继承的,我们需要 要显式地调用它们(例如超类.init(self))

否,仅当子类具有
\uuuuu init\uuuu
方法时才是这种情况

当我们在python中继承一个类时,init 超类的方法不是由子类继承的,我们需要 要显式地调用它们(例如超类.init(self))


不,只有在子类具有
\uu init\uuu
方法时才会出现这种情况。

这里的真正问题不是
Baz
实际上不支持与
Foo
相同的接口,因此不应该是它的子类吗?你能给出一个不那么抽象的例子吗?是的,你是对的,但这更倾向于理解python的惯用方法。这里真正的问题不是
Baz
实际上不支持与
Foo
相同的接口,因此不应该是它的子类吗?你能给出一个不那么抽象的例子吗?是的,你是对的,但这更接近于理解python的惯用方法。我明白了,所以我在子类Baz中创建了一个init方法,现在我可以创建一个对象了。这里的概念是,如果我继承了超类,那么只有在我没有为派生类定义init方法的情况下,init方法才会被执行。我的断言正确吗?我明白了,所以我在子类Baz中创建了一个init方法,现在我可以创建一个对象了。这里的概念是,如果我继承了超类,那么只有在我没有为派生类定义init方法的情况下,init方法才会被执行。我的断言正确吗?
  File "classesPython.py", line 20, in <module>
    ob2 = Baz()
  File "classesPython.py", line 4, in __init__
    self.value=self.get_value()
TypeError: get_value() takes exactly 2 arguments (1 given)