一、复习
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. 使用redis有序集合sorted set设计高效查询ip所在地

    1.将纯真版ip数据  xxx.data 导入至 redis(整个过程只花费了几秒) 引入nuget包 CSRedisCore,使用方法见:https://github.com/2881099/csr ...

  2. 深入解读MySQL8.0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  3. Linux运维企业架构实战系列

    Linux运维企业架构项目实战系列 项目实战1-LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2-LVS.nginx实现负载均衡系列 2.1 项目实战2.1-实现基于LVS负载均衡集 ...

  4. RAC(ReactiveCocoa)概括

    ReactiveCocoa(简称RAC,以下都用RAC)是github团队开源的一套基于Cocoa并且具有FRP(Functional Reactive Programming-响应式编程)特性的框架 ...

  5. js 获取上传视频的时长、大小、后缀名

    参考资料:获取时长 var fileName = $("#sectionfileUpload").val(); //C:\fakepath\3.jpeg var exts = fi ...

  6. 教你一招 | 用Python实现简易可拓展的规则引擎

    做这个规则引擎的初衷是用来实现一个可序列号为json,容易拓展的条件执行引擎,用在类似工作流的场景中,最终实现的效果希望是这样的: 简单整理下需求 执行结果最终返回=true= or false 支持 ...

  7. C# 获取当前服务器运行程序的根目录,获取当前运行程序物理路径

    C# 获取当前服务器运行程序的根目录,获取当前运行程序物理路径 string tmpRootDir = AppDomain.CurrentDomain.BaseDirectory;//获得当前服务器程 ...

  8. nginx性能优化(针对于高并发量仅供参考,并不是方案)

    目录 关于nginx.conf中的优化 配置nginx客户端网页缓存本地时间 nginx日志切割 nginx连接超时优化 Nginx 实现网页压缩功能 Nginx 实现防盗链功能 为目录添加访问控制 ...

  9. Cannot connect to WMI Provider & Invalid class [0x80041010]

    数据库服务器(Virtual Machine)所在的Nutanix一台主机由于故障,VM自动切换到另一台主机,切换过程中VM会重新启动,但是早上检查的时候,发现点击SQL Server Configu ...

  10. Go语言打造以太坊智能合约测试框架(level1)

    传送门: 柏链项目学院 Go语言打造以太坊智能合约测试框架 前言 这是什么? 这是一个基于go语言编写的,自动化测试以太坊智能合约的开发框架,使用此框架,可以自动化的部署合约,自动测试合约内的功能函数 ...