Python自学之乐-多继承顺序问题

最近自学Python到面向对象这里,感觉有必要把多继承这里好好理解一下,下面是我自己的一点小总结,如果有朋友觉得有什么不足的,还望不吝赐教!

1、#Author:clark

class Animal(object):#动物类    #kind = ""    def __init__(self,name,age,food):        self.Name = name        self.Age = age        self.food = food    def eat(self):        print("%s is eat %s" %(self.Name,self.food))    def barking(self):        print("%s is barking"%self.Name)class Relation(object):#动物关系类    def makefrined(self,obj):        print("%s is making friend with %s"%(self.Name,obj.Name))

class dog(Relation,Animal):#狗继承关系类与动物类    def __init__(self,name,age,food,kind):        super(dog,self).__init__(name,age,food)        self.kind = kind    def barking(self):        print("the barking of %s is wangwangwang!"%self.Name)class cat(Animal):    def __init__(self,name,age,food,kind):        super(cat,self).__init__(name,age,food)        self.kind = kind    def barking(self):        print("the barking of %s is miaomiaomiao"%self.Name)

dog_teddy = dog("ahuang",3,"bone","teddy")cat_xiaohua = cat("xiaohua",2,"fish","cat")dog_teddy.makefrined(cat_xiaohua)
运行结果为:ahuang is making friend with xiaohua一开始的疑惑在于,为什么类Relation的makefriend方法的,obj.name从哪来,怎么就运行成功了呢?后来发现Python的类继承的时候,有一个顺序:优先执行的是自己的构造方法,这里dog类有自己的构造方法,并且定义并继承了Animal类的name等属性,所以才会执行成功;后来我又想了想,如果把dog类自己的构造方法去掉呢?show me the code
2、#Author:clarkclass Animal(object):#动物类    #kind = ""    def __init__(self,name,age,food):        self.Name = name        self.Age = age        self.food = food    def eat(self):        print("%s is eat %s" %(self.Name,self.food))    def barking(self):        print("%s is barking"%self.Name)class Relation(object):#动物关系类    def makefrined(self,obj):        print("%s is making friend with %s"%(self.Name,obj.Name))

class dog(Relation,Animal):#狗继承关系类与动物类    # def __init__(self,name,age,food):    #     super(dog,self).__init__(name,age,food)    #     self.kind = kind    def barking(self):        print("the barking of %s is wangwangwang!"%self.Name)class cat(Animal):    def __init__(self,name,age,food,kind):        super(cat,self).__init__(name,age,food)        self.kind = kind    def barking(self):        print("the barking of %s is miaomiaomiao"%self.Name)

dog_teddy = dog("ahuang",3,"bone")cat_xiaohua = cat("xiaohua",2,"fish","cat")dog_teddy.makefrined(cat_xiaohua)
运行结果为:ahuang is making friend with xiaohua啊?为什么呢?明明dog没有构造方法了,按理说dog的实例对象去执行makefriend方法,发现类Relation没有name的属性,应该会抛错才对啊?才发现Python的类在继承的时候是去找构造方法的,这里dog没有构造方法,Relation也没有,那就找Animal的,发现有,就理所当然的执行成功了!其实大家可能知道python3类的继承顺序有一个从左往右的原则的,这里如果dog类的继承顺序写成dog(Animal,Relation),可能会觉得好理解一点,其实从左往右是正确的,原则是找到构造方法就不再往下找,可以验证一下,show  me the code
3、#Author:clarkclass Animal(object):#动物类    #kind = ""    def __init__(self,name,age,food):        self.Name = name        self.Age = age        self.food = food    def eat(self):        print("%s is eat %s" %(self.Name,self.food))    def barking(self):        print("%s is barking"%self.Name)class Relation(object):#动物关系类    def __init__(self):#给Relation写一个构造方法        pass    def makefrined(self,obj):        print("%s is making friend with %s"%(self.Name,obj.Name))

class dog(Relation,Animal):#这里的顺序注意了,两个的类的不同顺序是有区别的    # def __init__(self,name,age,food):    #     super(dog,self).__init__(name,age,food)    #     self.kind = kind    def barking(self):        print("the barking of %s is wangwangwang!"%self.Name)class cat(Animal):    def __init__(self,name,age,food,kind):        super(cat,self).__init__(name,age,food)        self.kind = kind    def barking(self):        print("the barking of %s is miaomiaomiao"%self.Name)

dog_teddy = dog("ahuang",3,"bone")cat_xiaohua = cat("xiaohua",2,"fish","cat")dog_teddy.makefrined(cat_xiaohua)运行结果为报错:TypeError: __init__() takes 1 positional argument but 4 were given因为首先找到Relation的构造方法,发现没有属性,就不再往下找了,直接报错!可以试一下Animal写在前,就不会报错。

综合以上1、2、3我用自己的语言组织了下总结(供参考吐槽):简单点就是Python的多继承有一个顺序,自己的构造方法 > 第一个类的构造方法 >大于第二个类的构造方法,以此类推,找到第一个构造方法为止,不再往下去找!!

				
时间: 2024-10-09 21:07:31

Python自学之乐-多继承顺序问题的相关文章

Python自学之乐-python 2、python 3中经典类、新式类的深度和广度优先小结

#Author:clarkclass Original(object):#在python 3 中写上object的新式类和不写的经典类遵循的都是广度优先原则 def __init__(self): print("in Original")class Second(Original): pass # def __init__(self): # print("in the second")class Third(Original): def __init__(self)

Python自学之乐-装饰器浅谈

以前学过点 面向对象的知识,我感觉这之间是有关联的,比如说装饰器的第一个要素是对被装饰的函数的封闭性,不允许更改:第二个就是对装饰器本oj身的可扩展性. 装饰器要点:高阶函数+嵌套函数=装饰器 需要掌握的知识点:1.函数即变量 2.高阶函数(函数的参数也是函数) 3.嵌套函数 装饰器一:装饰器不带参数,被装饰的函数也不带参数 简单的需求:现有两个简单的打印内容的函数,现在需要在不改变两个函数源代码的情况下统计每个函数运行时间 import timedef timer(func):#用到高阶函数

Python自学之乐-继承的新式类与经典类

#Author:clarkclass Animal(object):#python3中新式类写法,继承object(所有类的基类) #kind = "" #类属性 def __init__(self,name,age,food):#name等是实例属性 init方法叫做构造方法__del__是析构方法 self.Name = name self.Age = age self.food = food def eat(self): print("%s is eat %s"

python自学笔记

python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 循环 6.使用dict和set 6.1 dict 6.2 set 7.函数的使用 7.1函数返回多个值,同时接受多个值 7.2函数参数的默认值 7.3可变参数的函数 7.4可变个数带参数名的入参 7.5参数类型组合 8.关于函数递归 9.python的高级特性 9.1切片 9.2遍历 9.3列表生

Python - 自学django,上线一套资产管理系统

一.概述 终于把公司的资产管理网站写完,并通过测试,然后上线.期间包括看视频学习.自己写前后端代码,用时两个多月.现将一些体会记录下来,希望能帮到想学django做web开发的人.大牛可以不用看了,小白的第一个项目,写的很low,不入眼. 二.过程 1. python自学断断续续都有好长的时间,总是零零散散,没有去完完全全开发一个项目出来,跟别人说我会python,都没有啥说服力.后来下定决心,用python去做一个网站出来.正好公司平常维护资产的时候使用的是excel表,十分不科学.领导有意思

[Python自学] 项目发布流程

一.上线准备工作 1.准备Python虚拟环境:[Linux系统] CentOS7创建Python虚拟环境 2.安装Python依赖:[Python自学] 批量安装依赖 3.部署MariaDB:[数据库] MariaDB安装及使用 4.部署Redis集群:[NoSQL数据库] Redis集群部署 5.使用uWSGI运行项目:[Python自学] uWSGI启动django项目 5.部署Nginx:[Linux系统] (8)Nginx 6.使用LVS(可选):[Linux系统] (6)LVS负载均

Python 自学不求人

自学 Python 不求人,本文介绍 Python 自学时如何获取免费权威的帮助信息. 概述 如何使用 Python 自带的 help() 方法 如何利用 Python 文档 获取中文文档 获取帮助 help 每次进入 python 解释器的交互模式时,都会先打印横幅消息,在版本信息下面就是推荐 的命令: Type "help", "copyright", "credits" or "license" for more inf

Python 自学感想

将近三十岁的我回想了一下以前的种种......感到一种莫名伤感与无奈.伤感是因为:将近三十的我还是一事无成,身无分文,浪费太多的时间在一些无用的东西上面(比如:游戏).无奈是因为:只能眼睁睁的看着时间随风飘逝,而没有任何办法留住它,任它腐蚀着我的身心. 向前面的路望了望,只看到了无尽的深渊与绝望.我看不到以后的路,找寻不到一点希望.还是玩游戏吧,至少玩的时候心里不会想到这些烦心事,但是玩过之后,又是一阵无尽的空虚与伤感.于是删了游戏,(删了装,装了又删,自已都不记得重复了多少次了)强硬着逼自己再

Python 自学笔记(一)环境搭建

一,关于Python的介绍 关于Python的介绍,我不想多说了,网上随便一搜,很多介绍,这里我主要写下我的自学Python的 过程,也是为了促进我能继续学习下去. 二,环境搭建 1,这里我只讲解Windows,因为我比较喜欢Linux,但是windows 还是必须要用的,所以对linux不是经常用(我不是职业程序猿,只是个业余爱好者),不过这都是很简单的,不论哪个平台,都无所谓了 2,下载Python ,https://www.python.org/downloads/windows/ 选择你