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:鲜为人知的功能特性(上)
GitHub 上有一个名为<What the f*ck Python!>的项目,这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性,并尝试讨论这些 ...
- Pi Hybrids问题
Pi Hybrids问题 清华大学肖秀波梁湧老师翻译的Rardin教授的<运筹学>[1]已于今年年中出版,感谢机械工业出版社张有利老师的推荐和赠书,让我能看到如此完美的千页级宏篇译著.该书 ...
- jquery获取元素(父级的兄弟元素的子元素)
一.获取父级元素 使用jquery获取父级元素: parent() 例如:$(this).parent('ul'); 二.获取同级元素 使用jquery获取同级元素:siblings() 例如:$(t ...
- Spring Boot 2.x基础教程:快速入门
简介 在您第1次接触和学习Spring框架的时候,是否因为其繁杂的配置而退却了?在你第n次使用Spring框架的时候,是否觉得一堆反复黏贴的配置有一些厌烦?那么您就不妨来试试使用Spring Boot ...
- vue-resource实现数据的绑定、添加、删除
vue-resource实现数据的绑定.添加.删除 <!DOCTYPE html> <html lang="en"> <head> <ti ...
- Ambiguous HTTP method Actions require an explicit HttpMethod binding for Swagger 2.0
异常内容 NotSupportedException: Ambiguous HTTP method for action . Actions require an explicit HttpMetho ...
- jQuery(四)、文档处理
1 内部插入 1.1 append(content | fn) 向每个匹配的元素内部追加内容. 参数: (1) content:要追加到目标中的内容. (2) function(index, html ...
- 零基础学Python--------第9章 异常处理及程序调试
第9章 异常处理及程序调试 9.1 异常概述 在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”.这些异常有的是由于开发者将关键字敲错导致的,这类错误多数产生的是SyntaxError ...
- openlayers 3方法继承
之前Web GIS开发使用的ArcGIS API用起来很系统,但是使用开源Web GIS API已经成主流趋势(你懂的~),最近项目想要从ArcGIS API 转到openlayers API,用起来 ...
- 【Docker笔记】-开启TCP管理端口
如果我们通过docker来整合spring cloud项目,可以通过maven-docker插件将构建好的镜像直接推送到docker服务器上,但是生产环境建议关闭该功能,为了安全考虑.开启tcp远程监 ...