我对Python中的 init ()和继承有疑问。以下代码来自thinkbayes:
假设我们有一个父类Pmf,其中它具有诸如Set()和Normalize()之类的功能。现在,我们要构建另一个名为Cookie的类,该类继承了Pmf类。
spark = SparkSession.builder \
.appName("TEST_APPLICATION") \
.enableHiveSupport() \
.getOrCreate()
l = [('Alice', 1)]
df = spark.createDataFrame(l, ['name', 'age'])
df.show()
这是我的问题,因为这基本上是在从父类继承init()之后重新定义子类的init(),因此我们称:
class Cookie(Pmf):
def __init__(self, hypos):
Pmf.__init__(self)
for hypo in hypos:
self.Set(hypo, 1)
self.Normalize()
但是,在这一行之后,
Pmf.__init(self)
self.Set(hypo,1)和self.Normalize()中的“ self”是Pmf类还是新Cookie类的“ self”?
我有点困惑... 非常感谢你!
答案 0 :(得分:1)
是
AccessibleObject
类中的self
中的self.Set(hypo, 1)
还是新self.Normalize()
类中的self
中的Pmf
?
这是一个错误的二分法:只有一个Cookie
。它的类型是正在创建其实例的类。在您的示例中,这是self
。
答案 1 :(得分:1)
如果您写了c = Cookie
,则self
和Cookie.__init__
中的Pmf.__init__
指的是Cookie
的相同实例。 self
的类型不会根据调用的函数而改变。
到达__init__
的机器是这样的:c = Cookie()
(忽略几个步骤)首先导致对Cookie.__new__()
的调用,该调用将返回{{ 1}}。然后,该新实例将传递到Cookie
;该实例就是Cookie.__init__
在self
中所指。调用Cookie.__init__
时,该实例的类型不会改变;仍然是Pmf.__init__(self)
由Cookie
进一步处理的一个实例。
答案 2 :(得分:1)
首先,您应该使用超级功能:
super(Cookie, self).__init__()
第二,自我总是指对象的实例。您从self对象调用方法的事实意味着您调用在继承树中找到的具有该名称的第一个方法。因此,如果Cookie包含这样的方法,则将调用该方法,如果不包含该方法,则将使用继承的类中包含的方法。这就是超级人所做的。
此外,Python3和Python2之间存在super的不同语法