如何添加到从另一个 class 继承的 python class 的初始定义?
How can I add to the initial definition of a python class inheriting from another class?
我试图在继承自 class
的 class 中定义 self.data
class Object():
def __init__(self):
self.data="1234"
class New_Object(Object):
# Code changing self.data here
但我 运行 遇到了问题。
class Object():
def __init__(self):
self.data="1234"
所以我这里有开头的class,是从别处引进的,再说class是通用的,根本没法修改原来的
原来实例在class中被称为“self
”,在定义__init__
.
中被定义为self
class New_Object(Object):
# Code changing self.data here
所以如果我想继承class Object
,但是在New_Object
里面定义self.data,我想我必须定义__init__
在 New_Object
中,但这会覆盖 New_Object
中的 __init__
有什么方法可以做到这一点而无需从 Object
复制粘贴 __init__
?
您使用 super
调用原始实现。
class New_Object(Object):
def __init__(self):
super(NewObject, self).__init__()
self.info = 'whatever'
这就是 super
的用途:
class NewObject(Object):
def __init__(self):
super(NewObject, self).__init__()
# self.data exists now, and you can modify it if necessary
您可以使用 super().__init__()
从 New_Object.__init__()
调用 Object.__init__()
。
你会做什么:
class Object:
def __init__(self):
print("Object init")
self.data = "1234"
class New_Object(Object):
def __init__(self):
print("calling super")
super().__init__()
print("data is now", self.data)
self.data = self.data.split("3")
o = New_Object()
# calling super
# Object init
# data is now 1234
请注意,您不必为 super()
提供任何参数,只要您使用 Python 3.
答案是您在子class的__init__
期间显式地调用超级class的__init__
。这可以通过以下两种方式之一完成:
Object.__init__(self) # requires you to name the superclass explicitly
或
super(NewObject, self).__init__() # requires you to name the subclass explicitly
后者还要求您确保使用的是 "new-style" classes:在 Python 3 中总是如此,但在 Python 2 中您必须确保从内置 object
class 继承。在Python3中其实可以更简单的表达:
super().__init__()
就我个人而言,在我的大部分代码中,"disadvantage" 必须显式命名 superclass 一点也不不利,并且 Object.__init__()
提供了透明度,因为它绝对清楚什么叫做。这是因为我的大部分代码只是单一继承。当你有多重继承时, super
路由就派上用场了。参见 What does 'super' do in Python?
Python 2 例子:
class Object(object):
def __init__(self):
self.data = "1234"
class NewObject:
def __init__(self):
# subclass-specific stuff
super(NewObject, self).__init__()
# more subclass-specific stuff
我试图在继承自 class
的 class 中定义self.data
class Object():
def __init__(self):
self.data="1234"
class New_Object(Object):
# Code changing self.data here
但我 运行 遇到了问题。
class Object():
def __init__(self):
self.data="1234"
所以我这里有开头的class,是从别处引进的,再说class是通用的,根本没法修改原来的
原来实例在class中被称为“self
”,在定义__init__
.
class New_Object(Object):
# Code changing self.data here
所以如果我想继承class Object
,但是在New_Object
里面定义self.data,我想我必须定义__init__
在 New_Object
中,但这会覆盖 New_Object
__init__
有什么方法可以做到这一点而无需从 Object
复制粘贴 __init__
?
您使用 super
调用原始实现。
class New_Object(Object):
def __init__(self):
super(NewObject, self).__init__()
self.info = 'whatever'
这就是 super
的用途:
class NewObject(Object):
def __init__(self):
super(NewObject, self).__init__()
# self.data exists now, and you can modify it if necessary
您可以使用 super().__init__()
从 New_Object.__init__()
调用 Object.__init__()
。
你会做什么:
class Object:
def __init__(self):
print("Object init")
self.data = "1234"
class New_Object(Object):
def __init__(self):
print("calling super")
super().__init__()
print("data is now", self.data)
self.data = self.data.split("3")
o = New_Object()
# calling super
# Object init
# data is now 1234
请注意,您不必为 super()
提供任何参数,只要您使用 Python 3.
答案是您在子class的__init__
期间显式地调用超级class的__init__
。这可以通过以下两种方式之一完成:
Object.__init__(self) # requires you to name the superclass explicitly
或
super(NewObject, self).__init__() # requires you to name the subclass explicitly
后者还要求您确保使用的是 "new-style" classes:在 Python 3 中总是如此,但在 Python 2 中您必须确保从内置 object
class 继承。在Python3中其实可以更简单的表达:
super().__init__()
就我个人而言,在我的大部分代码中,"disadvantage" 必须显式命名 superclass 一点也不不利,并且 Object.__init__()
提供了透明度,因为它绝对清楚什么叫做。这是因为我的大部分代码只是单一继承。当你有多重继承时, super
路由就派上用场了。参见 What does 'super' do in Python?
Python 2 例子:
class Object(object):
def __init__(self):
self.data = "1234"
class NewObject:
def __init__(self):
# subclass-specific stuff
super(NewObject, self).__init__()
# more subclass-specific stuff