栏目分类
热点资讯
你的位置:四虎影院地址 > 无限免费观看视频大全 > 无限免费观看视频大全 既是爸爸又是爷爷?Python 众继承中的一个诡异表象

无限免费观看视频大全

无限免费观看视频大全 既是爸爸又是爷爷?Python 众继承中的一个诡异表象

发布日期:2021-10-13 19:33    点击次数:70

吾们清新,在面向对象编程内里,继承是一个很主要的概念。子类能够行使父类的手段和属性。例如下面这段代码:四虎影院的网站

class Father:     def __init__(self):         self.address = '上海'      def say(self):         print('吾是爸爸')  class Son(Father):     def __init__(self):         super().__init__()      def say(self):         print('吾是儿子')  son = Son() print(son.address) 

运走成绩如下图所示:

从图中能够望到,子类并异国self.address这个属性,但是当吾们直接打印的时候,并不会报错,它会自动行使父类的address属性。

隐微,倘若一个属性,子类也异国,父类也异国,那一定会报错,如下图所示:

吾们也清新,Python 是声援众继承的,一个子类能够有众个父类。那么,行家请望下面这段代码:

class GrandFather:     def __init__(self):         self.address = '上海'      def say(self):         print('吾是爸爸')  class Father:     def __init__(self):         self.age = 100          def where(self):         print('吾现在住在:', self.address)  class Son(GrandFather, Father):     def __init__(self):         super().__init__()      def say(self):         print('吾是儿子')  son = Son() son.where() 

运走成绩如下图所示:

行家仔细不都雅察,会发现这段代码有点奇迹。吾调用的是son.where()手段,由于Son类异国这个手段,于是它会往它的两个父类内里找。于是在Father这个父类内里找到了。于是实走Father内里的where()手段,现在为止异国题目。

但接下来就偏差了,.where()手段内里,调用了self.address属性。可题目是Father这个类它并异国.address属性啊!而且Father也异国父类,那么这个.address属性是从那里来的?

难道说,在开发者不清新的湮没的角落内里,GrandFather 类悄悄成为了Father的父类?如许一来,GrandFather岂不是又是 C 的父类,又是 C 的父类的父类?GrandFather既是爸爸又是爷爷?

实际上,并不存在这么紊乱的有关。要注释这个表象,吾们就要从self这个东西说首。

吾们清新,类的属性都是以self起头,手段的第一个参数也是self。那么这个 self 到底是什么东西?吾们用一段幼代码来望望它是什么东西:

class A:     def get_self(self):         return self  test = A() what_is_self = test.get_self()  test is what_is_self 

运走成绩如下图所示:

从图内里能够望到,self实际上就是这个类的实例。吾们再来望有继承的情况:

class A:     def get_self(self):         return self  class B(A):     def __init__(self):         ...  test = B() what_is_self = test.get_self()  print(what_is_self) 

从图中能够望到,固然吾在 A 类的.get_self()手段中返回了self,但这个self实际上是 B 类的实例。由于吾自首至终就只初首化了 B 类,并异国初首化 A 类。A 固然是 B 类的父类。但父类的 self 都会变成子类的实例。

清新这一点以后,前线的题目就很益注释了,吾们众打印一些新闻:

行家仔细画红线的地方,self首终都是Son类的实例。因此,一路先初首化.address的时候,就是初首化的Son的实例的.address属性。后面在.where内里调用.address的时候,也是读取的Son的实例的.address属性。因此,并不存在Father类往读GrandFather类的情况。自首至终,都是Son类的实例在进走各栽操作。

因此,在这个例子内里,当行使了继承以后,一切父类的属性和手段,子类倘若有相通的名字,那么以子类的为准。倘若子类异国定义,那么父类的属性和手段,其实都会跑到子类内里往。一切望首来是父类进走的操作,其实都是子类在进走。上面的代码,甚至能够近似等价于:

由于say手段在子类中有了定义,因此子类遮盖父类。以子类的say手段为准。where和address由于子类异国定义,因此Father类的where手段和GrandFather内里的address属性,都会直接跑到子类内里。

鸿蒙官方战略配相符共建——HarmonyOS技术社区无限免费观看视频大全