摘要:因此,之后的版本使用方法实现继承。全称,代表类的继承顺序。计划年月底之前翻译完成对讲解最透彻的一篇文章是的一篇文章。
读django类视图代码时,遇到这样一个问题:
class A(object): def __init__(self): pass def get_data(self, **kwargs): print "enter A" if "A" not in kwargs: kwargs["A"] = "value A" print "leave A" return kwargs class B(A): def get_data(self, **kwargs): print "enter B" if "B" not in kwargs: kwargs["B"] = "value B" print "leave B" return super(B, self).get_data(**kwargs) class C(A): def get_data(self, **kwargs): print "enter C" if "C" not in kwargs: kwargs["C"] = "value C" print "leave C" return super(C, self).get_data(**kwargs) class D(C, B): def use_data(self): print "enter D" data = self.get_data(D="value D") print "data value:",data print "leave D" return if __name__ =="__main__": d = D() d.use_data()
这套程序中,D的use_data函数中的data的值应该是什么,这里的运行结果是:
enter D enter C leave C enter B leave B enter A leave A data value: {"A": "value A", "C": "value C", "B": "value B", "D": "value D"} leave D
需要注意的是:这里的A必须继承object,如果A不继承object,程序变成这样:
class A(): def __init__(self): pass def get_data(self, **kwargs): print "enter A" if "A" not in kwargs: kwargs["A"] = "value A" print "leave A" return kwargs class B(A): def get_data(self, **kwargs): print "enter B" if "B" not in kwargs: kwargs["B"] = "value B" print "leave B" return super(B, self).get_data(**kwargs) class C(A): def get_data(self, **kwargs): print "enter C" if "C" not in kwargs: kwargs["C"] = "value C" print "leave C" return super(C, self).get_data(**kwargs) class D(C, B): def use_data(self): print "enter D" data = self.get_data(D="value D") print "data value:", data print "leave D" return if __name__ =="__main__": d = D() d.use_data()
运行结果会报错:
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/apple/mygit/kd/demo/class_inheritance_example.py Traceback (most recent call last): enter D File "/Users/apple/mygit/kd/demo/class_inheritance_example.py", line 41, inenter C d.use_data() leave C File "/Users/apple/mygit/kd/demo/class_inheritance_example.py", line 34, in use_data data = self.get_data(D="value D") File "/Users/apple/mygit/kd/demo/class_inheritance_example.py", line 28, in get_data return super(C, self).get_data(**kwargs) TypeError: must be type, not classobj
这是python继承问题,通过问度娘,找到好多文章,这里按自己的方式记录整理,以备后续使用。
python实现继承的方法python可以采用两种方法实现继承。
方法1:使用父类名,例:
class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" A.__init__(self) print "leave B"
方法2,使用super,例:
class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" super(C,self).__init__() print "leave B"
方法1是python2.2之前的版本实现继承采用的方法。该方法的问题在于如果有多个继承,当父类更改名字时,所有的子类都要进行相应修改。因此,python2.2之后的版本使用方法2实现继承。
supersuper是MRO中的一个类。MRO全称Method Resolution Order,代表类的继承顺序。
关于super,需要注意的一点是它是一个访问排序器,而不是父类。
计划2017年8月底之前翻译完成对super讲解最透彻的一篇文章是Raymond Hettinger的一篇文章https://rhettinger.wordpress....。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/40723.html
摘要:优先顺序模糊多重继承的优先顺序,方法调用顺序不明确。在松本行弘的松本行弘的程序世界中介绍了中类的几个原则通常的继承用单一继承第二个以及两个以上的父类必须是的抽象类中的多重继承应该也适用。 我们前面理解了类。类就是把具体事物给抽象出来。其实也有归类、类别的意思。我们举一个例子:人的职业有Teacher、Coder、Writer、Singer等职业继承关系就是: Pe...
摘要:解决的办法在处理计算密集型任务时,使用多进程协程,发挥计算机多核的威力,而处理密集型,则可以使用多线程。至此,有关知识点的面试题就已告一段落,下次更新数据库,方面面试题。 showImg(https://segmentfault.com/img/bVbuYzy?w=3484&h=2480); 阅读本文大约需要 5 分钟。 15.说一说 GIL 前面有提到由于 Python 基于 C 语...
摘要:今天我们介绍的主角是在类的继承里面非常常用,它解决了子类调用父类方法的一些问题,父类多次被调用时只执行一次,优化了执行逻辑,下面我们就来详细看一下。 1 谈谈你对面向对象的理解? 面向对象的编程---object oriented programming,简称:OOP,是一种编程的思想。OOP把对象当成一个程序的基本单元,一个对象包含了数据和操作数据的函数。面向对象的出现极大的提高了编...
摘要:时代,如果需要手动继承,如多态多态是指,不同的子类对象调用相同的父类方法,会产生多态多样结果的编程特性。 参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的就是:推荐从小往大开始封装、开发类。比如手枪...
阅读 1980·2021-09-30 09:47
阅读 674·2021-09-22 15:43
阅读 1945·2019-08-30 15:52
阅读 2397·2019-08-30 15:52
阅读 2495·2019-08-30 15:44
阅读 835·2019-08-30 11:10
阅读 3330·2019-08-29 16:21
阅读 3267·2019-08-29 12:19