DAY23、面向对象特性
一、复习
1、类:
对象属性的查找顺序:先找自身再找类
类的名称空间:直接写在类中
对象的名称空间:写在__init__方法中,通过self.属性形成名称空间中的名字
类的方法:在类中用@classmethod装饰的方法,第一个参数一定接收类,建议只拿类调用
对象的方法:在类中定义的普通方法,第一个参数一定接收对象,建议只拿对象调用
2、封装:对外隐藏属性与方法的实现细节,类的内部均可以直接访问__名字
方式:在属性或方法前用__修饰,将__名字更名为_类名__名字
作用:有些属性或方法只提供给内部使用,所以采用封装处理
对象属性的封装,对外提供接口
@property
def id(self):
return self.__id
@id.setter
def id(self,id):
seif.__id = id
@id.deleter
def id(self):
del self.__id
二、组合
自定义类的对象作为另外一个类的属性
class Teacher:
def __init__(self,name,age):
self.name = name
self.age = age t1 = Teacher('Bom',18)
print(type(t1.name),type(t1.age)) class Student:
def __init__(self,name,age,teacher):
self.name = name
self.age = age
self.teacher = teacher stu = Student('Tom',18,t1)
print(stu.__dict__)
print(stu.teacher.name)
print(stu.teacher.age) 三、继承
1、将所有共有的属性与方法抽离出,形成父类
父类是多个有共同点的普通类抽离共有属性与方法形成的类
继承:子类与父类形成的一种关系,可以让子类能直接从父类中获取属性与方法
优点:减少代码冗余
两个名词:
先写子类:抽离 出父类 (先有多个有共同点的类,抽离出共性的形成的类)
先写父类:派生 出子类 (通过已有的父类,再去定义该类的子类)
2、语法
class People:
def __init__(self,name):
self.name = name
def eat(self):
print(self.name + '在吃饭') class Student(People):
identify = '学生' student = Student('Bob')
student.eat() class Teacher(People):
pass class Leader(People):
pass 3、属性与方法的继承
父类所有未封装的属性和方法都可以被继承:
父类的所有未封装的属性和方法,子类都能访问
父类的所有封装的属性和方法,子类都不能访问
在外界通过子类或子类对象,不能访问
在子类内部也不能访问 class Sup:
__num = 10
def __init__(self,name):
self.__name = name @property
def name(self):
return self.__name @classmethod
def __c_fn(cls):
print(cls,'c fn') def __o_fn(self):
print(self.name,'o fn') class Sub(Sup):
def test(self);
print(self)
print(self.__name)
pass print(Sub.num) #不能被访问
Sub.c_fn() #不能被访问
sub = Sub('Bob')
print(sub.name) #Bob
sub.o_fn() #不能被访问
sub.test() #不能被访问 因为内部不能访问__name 4、有父类时的属性(方法)查找顺序:
优先找自身,自身没有找父类
父类没有找父类的父类
一直找到最顶级的父类,如果还没有就报错 5、方法的重写:
先写好父类的方法,由于父类的功能不满足子类需求
子类可以重写父类的方法:方法名与父类相同,自定义方法的实现体
class Sup:
num = 10 def test(sef):
print('test sup') class Sub(self):
num = 100 def test(self):
print('test sub') print(Sub.num) #100 优先查找自己的
Sub().test() #test sub 6、方法的重用:
重用:还需要父类方法的功能,在父类方法功能基础上再添加新功能
突破点:在子类中去调用父类的方法,还有保证调用者是子类(子类的对象)
class Sup:
def test(self):
print('>>>sup',self)
print('test sup') class Sub(sup):
pass def test(self):
super().test() #python2中写法 super(Sup,self).test()
print('>>>sub',self)
print('test sub') Sub().test() 7、__init__结合super()
class Sup:
def test(self):
print(self) def __init__(self,name)
self.name = name class Sub(Sup):
#有继承关系下,只要名字相同,即使产生不同,还是属于同一个方法
def test(self,num):
super().tset()
print(num) #默认父级的__init__可以被继承过来,
#但是会出现子类对象的属性比父类多
def __init__(self,name,salary):
super().__init__(name) #父级有的共性功能通过super()交给父级做
self.salary = salary #子类特有的自己来完成 Sub('Bob',15000).test(10)
Sub().test() #使用还是使用自身带参的,不能使用父级不带参的(本质名字相同就是一个,优先查找自己的) 8、多继承
简单的多继承:
属性的查找顺序:优先找自己的,如果没有,按照继承先后查找父级
子类可以继承所有父类的所有可继承属性
class A:
name = 'A'
num = 10 class B:
name = 'B'
count = 100 class C(A,B):
pass #自己=》A=》B 复杂的多继承:
class A:
name = 'A' class B(A):
name = 'B' class C:
name = 'C' class D(C):
name = 'D' class E(B,D):
name = 'E' #E=>B=>A=>D=>C
菱形继承:
经典类:python2中才有,没有继承任何类的类
新式类:python2中没有直接或间接继承object的类(python3中没有明确继承关系的类默认继承object),
python中所定义的所有类
深度优先,在查找第一个分支查找到底
广度优先,菱形的头在所有分支查找接收后再被查找
通过 类.mro()查看继承顺序图
DAY23、面向对象特性的更多相关文章
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- javascript进阶——面向对象特性
面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的 ...
- C++对C语言的非面向对象特性扩充(3)
今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(refer ...
- .NET面向对象特性之封装
.NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...
- .NET面向对象特性之多态
.NET面向对象特性之多态 前言 上一篇总结了面向对象三大特性之一的继承,再接再厉,这一章继续总结多态.同时把继承中涉及到多态的内容进一步补充扩展.可以说“继承”是多态的根基.但继承主要关注的是“共通 ...
- .NET面向对象特性之“继承”
整体简介 1.理解继承——继承关系图 2.实现继承与接口多继承 3.new. virtual.override方法 4.抽象方法和抽象类的继承 5.继承的本质 6.继承的复用性.扩展性和安全性 7.多 ...
- TypeScript -- 面向对象特性
.class关键字和类名就可以定义一个类 . 类的访问控制符--有三个,.] = ] = ] = ;.声明参数 .用接口声明方法 .理解模块--一个文件就是一个模块,就是这么个意思 ,不用想的多么高大 ...
- Objective-C的面向对象特性(一)
Objective-C在c语言的基础上增加了面向对象特性,都有哪些面向对象特性呢? 其中第一个最重要的特性是类和对象的实现. Objective-C软件由许多对象构成,形成一个对象网络,对象之间通过发 ...
随机推荐
- Python:游戏:贪吃蛇原理及代码实现
一.游戏介绍 贪吃蛇是个非常简单的游戏,适合练手.先来看一下我的游戏截图: 玩法介绍:回车键:开始游戏空格键:暂停 / 继续↑↓←→方向键 或 WSAD 键:控制移动方向. 食物分红.绿.蓝三种,分别 ...
- 使用java语言,将字符串中连续重复出现的字母变成“出现次数“+字母的格式
今天在简书上看到这样一道有趣的算法题: 解题思路 首先定义一个变量element,默认是字符串的第一个字符.以element为基准元素,去判断某个字符是否重复.然后再去定义一个变量count去记录重复 ...
- Python input保证输入为int类型
t = float(input("t(℃)="))
- Rekit
本文转自:http://rekit.js.org/docs/get-started.html Get started The easiest way to try out Rekit is creat ...
- PHP设计模式的六大设计原则
PHP设计模式的六大设计原则 1 简介 软件设计最大的难题就是应对需求的变化,但是纷繁复杂的需求变化却是不可预料的.此时,我们可以通过六大设计原则良好的应对未来的变化. 2 讲解 2.1 单一职责原则 ...
- C#打印模板设计,E店宝打印模板设置,winfrom打印模板设计,DevExpress.XtraReports.UI.XRTable 表格代码生成。
一.打印效果 二.代码编辑 1 .table1 : table控件的Name: 2.label33 :label控件 实现绑定[外部平台单号]的控件: 3.label32:绑定[E店宝订单编号](S开 ...
- Dynamics CRM项目实例之七:站点地图修改,联系人-订单-积分管理
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复138或者20141229可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面文章发表后,不 ...
- SuperMap iServer 在Linux 部署中问题总结
SuperMap iServer 作为超图公司的云GIS服务器产品,一般是部署在Linux服务器上.下面把日常部署和使用过程中遇到的相关问题做以汇总. 1.部署iServer的第一步是要检查Linux ...
- Python 基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现
基于Python及zookeeper实现简单分布式任务调度系统设计思路及核心代码实现 by:授客 QQ:1033553122 测试环境 功能需求 实现思路 代码实践(关键技术点实现) 代码模块组织 ...
- MQTT简单介绍与实现
1. MQTT 介绍它是一种 机器之间通讯 machine-to-machine (M2M).物联网 Internet of Things (IoT)常用的一种轻量级消息传输协议适用于网络带宽较低的场 ...