一、复习
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. [Leetcode]450. Delete Node in a BST

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

  2. Spring Boot 2.0 配置图文教程

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 ...

  3. WebApiClient百度地图服务接口实践

    1. 文章目的 随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,然而在应用到实际项目中多多少少会遇到一些项目结合上的疑问和困难,本文将 ...

  4. .NET CORE 中使用AutoMapper进行对象映射

    简介 AutoMapper uses a fluent configuration API to define an object-object mapping strategy. AutoMappe ...

  5. Python编程从入门到实践笔记——变量和简单数据类型

    Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...

  6. Asp.Net.Identity认证不依赖Entity Framework实现方式

    Asp.Net.Identity为何物请自行搜索,也可转向此文章http://www.cnblogs.com/shanyou/p/3918178.html 本来微软已经帮我们将授权.认证以及数据库存储 ...

  7. HTTP概念解析

    HTTP--Hyper Text Transfer Protocol HTTP详细介绍(火星的小白 51CTO): https://blog.51cto.com/13570193/2108347 先进 ...

  8. Nginx支持 React browser router

    修改nginx配置文件,添加try_file配置如下,即可实现对 React browser router 的支持. location / { root /var/www/mysite; try_fi ...

  9. C# 中一些类关系的判定方法

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  10. 【Android】用Cubism 2制作自己的Live2D——官方App样例源码学习(3)!

    ---恢复内容开始--- 前言- 虽然上文说的是model的绘制但是这个说法并不严谨,之前的几个例子都会有模型文件的读入和载入,可是在LAppRenderer.LAppView中并没有.moc等文件的 ...