pytho类继承与访问控制

类的三要素之一,继承

从父类继承,就可以直接拥有了父类的方法和属性,减少冗余,增加复用,同时子类也可以定义自己的属性和方法

继承:class ****(需要继承的类)

这样就可以让其子类获得父类的方法与属性

父类:

也称为超类,和基类

子类:

也称为派生类

具体定义如下:

class 子类名(基类1,*,*,*):

语句块

如果类定义中,没有基类列表,等同于继承自object,,在python3中,object是所有对象的基类

python支持多继承,继承也可以多级

特殊属性和方法

__base__ 类的基类
__bases__显示当前继承的类
__mro__显示当前继承链
mro() 同上                         调用方法 ini.mro( )
__subclasses__( ) 类的子类列表          调用方法   ini.__subclasses__( )

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

类的属性构造 :

继承后的子类中若含有初始化函数__init__,就会覆盖父类的__init__的数据;

但是可以调用父类的 __init__来执行父类init的方法,他们的调用顺序不同,最后的结果也不同

私有的不可被覆盖

子类中如果有同名方法或者函数,就会覆盖父类的同名方法或者函数,但是私有属性不会被覆盖,哪个类的私有属性,就会被那个类的实例给加到字典中,不同字典的私有属性,加在实例中的数据名字也不一样

总结:

双下划线的会被保存到实例的属性中,可以使用property和方法,来让用户拿到这个私有属性

从父类继承,自己没有的,就可以到父类中找

私有的都是不可以访问的,但是本质上依然是改了名称放在这个属性所在类的__dict__,知道这个新名称就可以直接找到这个隐藏的变量,这是一个慎用的方法

继承时,共有的,子类和实例都可以随意访问;私有成员被隐藏,子类和实例不可直接访问,当私有变量所在的类内的方法中可以访问这个私有变量,(property,定义一个函数返回给self)

属性查找顺序,实例的__dict__ -->类 __dict__ 有继承-->父类__dict__

如果搜索这些地方后没有找到就会抛异常,先找到就立即返回

时间: 2024-10-23 17:00:39

pytho类继承与访问控制的相关文章

【C/C++】继承与访问控制

常见问题 Q1. 类child从类parent公有派生,则类child可以访问类parent中的哪些成员? A. public成员 B. private成员 C. protected成员 D. 数据成员 Q2. 类child从类parent公有派生,若有"child c;",那么c可以访问类parent中的哪些成员? A. public成员 B. private成员 C. protected成员 D. 都不能访问 Q3. 类child从类parent私有派生,则类child可以访问类p

C++ primer plus读书笔记——第13章 类继承

第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生出新的类.而且可以在不公开实现的情况下将自己的类分发给其他人,同时允许他们在类中添加新特性. 2. 派生类构造函数首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数. 3. 创建派生类对象时,程序首先调用基类构造函数,然后再调用派生类构造函数.派生类对象过期时,程序将首先调用派生

C++学习笔记(十二):类继承、虚函数、纯虚函数、抽象类和嵌套类

类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. 1 //单继承的定义 2 class B:public A 3 { 4 < 派生类新定义成员> 5 }; 6 //多继承的定义 7 class C:public A,private B 8 { 9 < 派生类新定义成员> 10 }; 我们这篇主要说单继承. 派生类共有三种C++类继承方式: 公有继承(public) 基类的公有成员和保护成

scala学习手记13 - 类继承

在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中要想重写方法必须使用override关键字.如果确实重写了父类的方法又不使用override关键字的话,则会在编译时报错,提示没有使用override修饰符. scala的副构造函数必须调用主构造函数或是另一个副构造函数.只有在主构造函数中才能向父类的构造函数中传递数据.可以看出来主构造函数如同父类

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

JS中“类”继承和原型继承

类继承: 先用函数构造器创建了一个“类”Student,然后在Student原型上定义了一个方法sayHello,然后创建了一个"类“PrimaryStudent,用apply()初始化PrimaryStudent. 然后让PrimaryStudent的原型等于Student创建的对象,并把PrimaryStudent原型上的构造器指向当前”类“,即PrimaryStudent,注意红色加粗部分. 1 function Student(name){ 2 this.name = name; 3 }

javascript伪类继承修订版

原先文章中提到的伪类继承,超类的构造函数会被执行两次,所以效率上会有点问题,看了高级程序之后,发现原来还可以改进,只需要用一个函数来实现继承即可. function inherit(subClass, superClass) { function F() {} //创建临时构造函数 F.prototype = superClass.prototype //将超类的原型作为临时构造函数的原型 var prototype = new F() //实例化临时函数,到这里其实是把superClass复制

smartjs 0.2 OOP讲解 - Klass 类继承

SmartJS2.0加入OOP的功能.OOP包括klass与factory两个对象. Klass 类继承 与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基类和初始化控制的扩展功能. 首先来看看接口: var _klass = st.klass(name, prop, parent, config); //new _klass() 与 _klass()效果相同,实现了自初始化功能更 var obj = new _klass(); name : 类名 p

javascript类继承

function extend(subClass, superClass) { var f = function() {}; f.prototype = superClass.prototype; subClass.prototype = new f(); subClass.superClass = superClass.prototype; } var parent = function (name, age) { this._name = name; this._age = age; };