多继承

day20

天大地大妈咪最大 提交于 2019-12-01 02:28:24
一、继承 类的继承 面向对象三要素之一,继承Inheritance class Cat(Animal)这种形式就是从父类继承,继承可以让子类从父类获取特征(属性和方法) 在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码,多复用,子类可以定义自己的属性和方法 1、查看继承的特殊属性和方法 base : 类的基类 based : 类的基类元组 mro : 显示方法查找顺序,基类的元组 __mro()__方法 : 显示方法查找顺序,基类的元组 subclasses () : 类的子类列表 2、继承中的查找顺序 从父类继承,自己没有的就可以到父类中找 私有的都是不可以访问的,但是本质上依然是改了名称放在这个属性所在类的_ dict -中 继承时,公有的,子类和实例都可以随意访问,私有成员被隐藏了,子类和实例不可直接访问 当私有变量所在的类内的方法中可以访问这个私有变量 属性查找属性:实例的dict--》类的dict--》父类dict 多继承 OCP原则:多继承,少修改;继承的用途:增强基类,实现多 1、多态 在面向对象中,父类,子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同的表现,就是多态 一个类继承自多个类就是多继承,它将具有多个类的特征 2、多继承弊端 多继承很好的模拟了世界,因为事物很少是单一继承,但是舍弃简单,必然引入复杂性带来冲突

Java与C++的区别

六眼飞鱼酱① 提交于 2019-11-30 14:22:46
都是面向对象的语言,都支持封装、继承和多态 Java 不提供指针来直接访问内存,程序内存更加安全 Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。 Java 有自动内存管理机制,不需要程序员手动释放无用内存 来源: https://www.cnblogs.com/cchenyang/p/11595581.html

mixin多继承包装过程

邮差的信 提交于 2019-11-29 22:22:53
应用中使用 django . view.generic 中的视图类View, 之后使用 django . contrib . auth 的login登录模块.. 但, 装饰包内 login_required 登录验证模块无法直接对类进行装饰 在 utils 内创建一个多继承 mixin 模块, 通过二次包装解决此问题. # utils 有用的工具, 类, 函数. 框架中所有复用工具, 都放在这个单独的文件包 # mixin 代表多继承 from django.contrib.auth.decorators import login_required # 实现用户登录状态验证的方法. 定义login_required_mixin的类, 为login_required增加对提交方法的识别. # 使app中的类, 先继承此类, 判断其是否有登录状态, 之后在决定运行还是跳转. class LoginRequiredMixin(object): # 定义和视图类相同的as_view方法, (参数需要和视图类中完全相同) @classmethod def as_view(cls, **initkwargs): # 调用父类的as_view view = super(LoginRequiredMixin, cls).as_view(**initkwargs) # 重点:

C++对象模型:单继承,多继承,虚继承,菱形虚继承,及其内存布局图

放肆的年华 提交于 2019-11-29 22:02:48
C++目前使用的对象模型: 此模型下, nonstatic数据成员被置于每一个类的对象中 ,而 static数据成员则被置于类对象之外 , static和nonstatic函数也都放在类对象之外(通过函数指针指向) ,而 对于virtual函数,则通过虚函数表+虚函数指针来支持 : 1)每个类生成一个表格,称为 虚表 (virtual table,简称vtbl),虚函数表中存在一堆指针,这些指针指向该类的每一个虚函数,虚表中的函数地址按照声明时的顺序排列 2)每个类对象都有一个 虚表指针 (简称vptr),由编译器为其生成,虚表指针的设定和重置皆由类的相关函数控制(构造函数,析构函数,赋值操作符),虚表指针vptr的位置由编译器决定,一般编译器把vptr放在一个类对象的最前端(也就是说对象的地址就是vptr的地址) 3)虚函数表的前面设置了一个指向type-info的指针,用以支持RTTI(Run Time Type Identification,运行时类型识别),RTTI是为支持多态生成的信息,包括对象的继承关系,对象本身的描述等,只有具有虚函数的对象才会生成 样例: class Base { public: Base(int i) :baseI(i){}; int getI(){ return baseI; } static void countI(){}; virtual

JS继承的几种方式

早过忘川 提交于 2019-11-29 19:58:42
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。 既然要实现继承,那么我们先定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = function(){ alert(this.name + '正在睡觉!'); } } // 原型方法 Animal.prototype.eat = function(food) { alert(this.name + '正在吃:' + food); }; 1、原型链继承 核心: 将父类的实例作为子类的原型 function Cat(){ } Cat.prototype = new Animal(); Cat.prototype.name = 'cat'; // Test Code var cat = new Cat(); alert(cat.name); alert(cat.eat('fish')); alert(cat.sleep()); alert(cat instanceof Animal); //true alert(cat instanceof Cat); //true 特点: 非常纯粹的继承关系,实例是子类的实例,也是父类的实例 父类新增原型方法/原型属性,子类都能访问到 缺点:

python 面向对象之继承

我是研究僧i 提交于 2019-11-29 13:56:06
继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为 基类 或 超类 ,新建的类称为 派生类 或 子类 python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass 提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如 __str__ )的实现 >>> ParentClass1.__bases__ (<class 'object'>,) >>> ParentClass2.__bases__ (<class 'object'>,) 抽象与继承(先抽象再继承) 抽象即抽取类似或者说比较像的部分。 抽象分成两个层次: 将奥巴马和梅西这俩对象比较像的部分抽取成类; 将人,猪,狗这三个类比较像的部分抽取成父类。 抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度) 继承

Python高级语法-多继承MRO相关-args和kwargs(4.5.2)

杀马特。学长 韩版系。学妹 提交于 2019-11-28 15:07:56
目录 1.说明 2.代码 关于作者 @ 1.说明 args数据类型为元组 kwargs数据类型为字典 一般传入方法中使用遍历去得到值 这个传入参数的顺序没有特殊的要求 当你自定义的参数传完以后,写了名字的就给kwargs,没有名字的给args 2.代码 def test(*args,**kwargs): for i in args: print(i) for i in kwargs: print(kwargs[i]) if __name__ == '__main__': test(1,2,3,3,4,4,12,4,12,4,name="adada",hhehe="dadad") 关于作者 个人博客网站 个人GitHub地址 个人公众号: 来源: https://www.cnblogs.com/simon-idea/p/11411781.html

多继承

我只是一个虾纸丫 提交于 2019-11-28 13:11:56
Python允许从多个父类继承 , 称为多重继承 class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 多重继承通过 super()调用__init__()方法时 , A 虽然被继承了两次,但__init__()只调用一次 实例 class Person(object): pass class Student(Person): pass class Teacher(Person): pass class SkillMixin(object): pass class BasketballMixin(SkillMixin): def

C++——类的多继承

与世无争的帅哥 提交于 2019-11-28 08:24:53
多继承概念 一个类有多个直接基类的继承关系称为多继承 多继承声明语法 class 派生类名 : 访问控制 基类名1 , 访问控制 基类名2 , … , 访问控制 基类名n { 数据成员和成员函数声明 }; 类 C 可以根据访问控制同时继承类 A 和类 B 的成员,并添加 自己的成员 多继承的派生类构造和访问 多个基类的派生类构造函数可以用初始式调用基类构造函数初始化数据成员 执行顺序与单继承构造函数情况类似。多个直接基类构造函数执行顺序取决于定义派生类时指定的各个继承基类的顺序。 一个派生类对象拥有多个直接或间接基类的成员。不同名成员访问不会出现二义性。如果不同的基类有同名成员,派生类对象访问时应该加以识别 #include <iostream> using namespace std; class Base1 { public: Base1(int b1) { this->b1 = b1; } void printB1() { cout<<"b1:"<<b1<<endl; } protected: private: int b1; }; class Base2 { public: Base2(int b2) { this->b2 = b2; } void printB2() { cout<<"b2:"<<b2<<endl; } protected: private: int b2

C++_练习—继承_多继承

孤街浪徒 提交于 2019-11-27 15:31:40
多继承 多继承:派生类继承多个基类(继承多父类特性) 语法:class <派生类名>: <继承方式1><基类名1> , <继承方式2><基类名2> , ...{ <派生类类体>; } 1 #include <iostream> 2 3 using namespace std; 4 5 class info1 { 6 public: 7 void setter1(int a) { 8 num1 = a; 9 } 10 11 protected: 12 int num1; 13 14 private: 15 int age1; 16 }; 17 18 class info2 { 19 public: 20 void setter2(int a) { 21 num2 = a; 22 } 23 24 protected: 25 int num2; 26 27 private: 28 int age2; 29 30 }; 31 32 class info : public info1, public info2 { 33 public: 34 void fun(void) { 35 int a; 36 a = num1 + num2; 37 cout << a << endl; 38 } 39 40 protected: 41 int num3; 42 43 private: 44 int