一、复习
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、面向对象特性的更多相关文章

  1. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  2. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

  3. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  4. javascript进阶——面向对象特性

    面向对象的javascript是这门语言被设计出来时就考虑的问题,熟悉OOP编程的概念后,学习不同的语言都会发现不同语言的实现是不同的,javascript的面向对象特性与其他具有面向对象特性的语言的 ...

  5. C++对C语言的非面向对象特性扩充(3)

    今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(refer ...

  6. .NET面向对象特性之封装

    .NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...

  7. .NET面向对象特性之多态

    .NET面向对象特性之多态 前言 上一篇总结了面向对象三大特性之一的继承,再接再厉,这一章继续总结多态.同时把继承中涉及到多态的内容进一步补充扩展.可以说“继承”是多态的根基.但继承主要关注的是“共通 ...

  8. .NET面向对象特性之“继承”

    整体简介 1.理解继承——继承关系图 2.实现继承与接口多继承 3.new. virtual.override方法 4.抽象方法和抽象类的继承 5.继承的本质 6.继承的复用性.扩展性和安全性 7.多 ...

  9. TypeScript -- 面向对象特性

    .class关键字和类名就可以定义一个类 . 类的访问控制符--有三个,.] = ] = ] = ;.声明参数 .用接口声明方法 .理解模块--一个文件就是一个模块,就是这么个意思 ,不用想的多么高大 ...

  10. Objective-C的面向对象特性(一)

    Objective-C在c语言的基础上增加了面向对象特性,都有哪些面向对象特性呢? 其中第一个最重要的特性是类和对象的实现. Objective-C软件由许多对象构成,形成一个对象网络,对象之间通过发 ...

随机推荐

  1. Java 集合详解

    一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型.为了满足这些常规的编程需要,我们要 ...

  2. API接口通讯参数规范(2)

    针对[API接口通讯参数规范]这篇文章留下的几个问题进行探讨. 问题1 试想一下,如果一个http请求返回一个500给我们,那我们是不是都不用看详情都知道该次请求发生了什么?这正是一个标准的结果码意义 ...

  3. [开发技巧]·Numpy广播机制的深入理解与应用

    [开发技巧]·Numpy广播机制的深入理解与应用 1.问题描述 我们在使用Numpy进行数据的处理时,经常会用到广播机制来简化操作,例如在所有元素都加上一个数,或者在某些纬度上作相同的操作.广播机制很 ...

  4. 求求你别用SimpleDateFormat了!

    前言   啊哈哈,标题写的比较随意了,其实呢最近在各种面试以及博客中,SimpleDateFormat出镜率确实是比较高了,为什么?其实聪明的你们肯定知道,那必须是有坑呗,是的,那我们就以案例来分析一 ...

  5. python学习第四讲,python基础语法之判断语句,循环语句

    目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...

  6. [SpringBoot guides系列翻译]通过JDBC和Spring访问关系数据库

    原文 参考链接 hikaricp Spring Boot JDBC Starter Spring Boot Starter Parent h2 database introduction Autowi ...

  7. 查询拼接SQL语句,多条件模糊查询

    多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...

  8. loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)

    题意 题目链接 Sol 只会后缀数组+暴躁莫队套set\(n \sqrt{n} \log n\)但绝对跑不过去. 正解是SAM + set启发式合并 + 二维数点/ SAM + LCT 但是我只会第一 ...

  9. Dynamics 365-OnPremise V9 安装系统要求

    Dynamics 365 V9 OnPremise发布之后,博主率真地直接下载安装,首先就遇到了操作系统不支持的问题,但是通过CRM安装报错提示,发现给的链接参考信息也不对. document的链接调 ...

  10. VSCode 下载Models 报错

    VSCode调试部分代码时,报错,提示不能自动获取Models.报错信息如下. go: golang.org/x/crypto@v0.-80db560fac1f: unrecognized impor ...