1. python面向对象编程回顾
  • 基础概念:

    • 面向对象的编程简称OOP,它把对象作为程序的基本单元,一个对象包含了数据操作数据的函数
    • 面向对象的设计思想是抽象出Class,根据Class(类)创建Instance(实例对象),这也是面向对象的最重要的概念。是抽象出来的模板,而实例是根据模板创建出来的一个个具体的“对象”,每个对象都有相同的方法,但是各自的数据可能不同
    • python中所有的数据类型都可以看作是类,同时也可以自定义一个Class
    • 面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法。
    • 面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递
    • 数据封装继承多态是面向对象的三大特点
  • 类的定义:

//定义类的一般形式

class Student(object):
<statement 1>
...
<statement n >
//class声明这是一个类,类名一般都用大写字母开头,括号里面表示该类从哪里继承来的(父类),如果没有
合适的继承类,就使用object类,这是所有类最终都会继承的类。缩进语句块里面用来声明该类的各种数据和
functions
//实例代码
>>> class Student(object):
... Readline internal error
Traceback (most recent call last):
...
^
IndentationError: expected an indented block //报错?缩进用个Tab不行吗?
>>> class Student(object):
... pass //要一个空格缩进?
...
  • 创建类的实例
>>> Student()							//通过类名+()就创建出了一个类实例对象
<__main__.Student object at 0x0000024713B0AF60>
>>> instance = Student()
>>> instance //可以发现它是一个Student 类的 object
<__main__.Student object at 0x0000024713B0AE10>
>>> Student //但Student才并且仍是Student类
<class '__main__.Student'>
  • 属性
>>> instance.name = 'yo'		//此时我们就可以给实例变量自由的添加属性
>>> instance.name //但是添加的属性不会对类产生任何影响
'yo'
//但是我们可以在创建类的时候,提前定义好一些该类的每一个实例对象都该拥有的属性。
//通过定义一个特殊的__init__方法,在创建实例的时候,把name,age等属性绑上去:
>>> class Student(object):
... def __init__(self,name,age):
... self.name = name
... self.age = age //我python的缩进是不是弄错了。。
... //进入虚拟环境再用python缩进就正常了,代码好看多了。
>>> class Student(object):
... def __init__(self,name,age): //__init__方法的第一个参数永远是self,表示创建的实例本身
... self.name = name //下面的就表示类自身(Student)的一些属性
... self.age = age
... >>> instance = Student() //重新定义的类如果还不传参数就会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'name' and 'age' >>> instance = Student(name='ocean',age=19) //实例化的时候self不需要传入
>>> instance = Student('ocean',19) //传入参数的方法和用函数一样,有多种方式
>>> instance.name
'ocean'
>>> instance.age
19
>>> instance.score = 99.9 //此时,除了必须的,同样可以添加“个性化属性"
>>> class Student(object):
... def __init__(self): // __init__() 特殊方法(构造方法),该方法在类实例化时会自动调用
... print(666)
...
>>> yo = Student()
666
>>> class Student(object):
... def __init__(self):
... print(self) //一直不知道这个self表示的是什么,不如看看。
...
>>> yo = Student()
<__main__.Student object at 0x000001E1E2C9F188>
>>> Student //可以看出,self表示的是类实例化后的yo,而不是Student类
<class '__main__.Student'>

OMG,我居然也可以 ,温柔。 --19.8.17

  • 数据封装
//在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。
//这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法: >>> class Student(object):
... def __init__(self,name,age):
... self.name = name
... self.age = age
... def print(self,score): //封装数据的函数,self是必要的一个参数!
... print("name:%s age:%s"%(self.name,self.age))
... print("score = %s"%(score))
...
>>> instance = Student('ocean',19)
>>> instance.print(99.9)
name:ocean age:19
score = 99.9 //事实上,封装做的就是在类的内部定义函数,从而能够在类的内部对数据进行
处理,我们在外部只需要传入必要的参数,类在内部加工数据,传出我们想要的
结果,而不需要再外部设置函数如此以来使得类变得powerful
  • 继承
//在定义一个class的时候,我们可以从现有的某个已经存在了的类继承,被继承的类被称为父类或者基类(还
是很形象的),产生新的class被称为子类。(之前一直用的object被称为根类)
//上代码

>>> class Animal():
... def printf(self):
... print("This is a Animal")
...
>>> ins0 = Animal()
>>> ins0.printf()
This is a Animal >>> class Dog(Animal): //定义一个Dog类,继承自Animal类
... pass
...
>>> ins1 = Dog()
>>> ins1.printf() //调用继承自父类方法,看来只是原封不动的搬了过来
This is a Animal >>> class Cat(Animal): //定义一个 Cat 类,继承自Animal类
... def printf(self): //在子类中重写printf()方法
... print("This is a cat.")
...
>>> ins2 = Cat()
>>> ins2.printf() //调用继承自父类方法,可以发现子类重写的方法成功的将原方法覆盖掉
This is a cat.
  • 调用父类构造函数
//上代码
>>> class Student():
... def __init__(self,age):
... self.age = age
... print(age)
...
>>> yo = Student(19)
19 >>> class Colleage_stu(Student):
... def __init__(self,age,score):
... print(age)
... print(score)
...
>>> ocean = Colleage_stu(19,99) //成功的覆盖掉了构造方法(__init__)
19
99 >>> class Colleage_stu(Student):
... def __init__(self,age,score):
... Student.__init__(self,age) //继承Student类的self和age方法
... self.score = score //添加 自己的方法score
... print(score)
...
>>> ocean = Colleage_stu(19,99) //成功习得自己的方法score
19
99 >>> class Colleage_stu(Student):
... def __init__(self,age,score):
... print(score)
... Student.__init__(self,age)
... print(age)
...
>>> ocean = Colleage_stu(19,99) //基本上可以为所欲为
99
19
19 >>> class Colleage_stu(Student):
... def __init__(self,age,score):
... Student.__init__(self,age,score) //只要不缺心眼的继承一个父类没有的属性
... print(score)
...
>>> ocean = Colleage_stu(19,99)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __init__
TypeError: __init__() takes 2 positional arguments but 3 were given
  • 多继承
//所谓多继承,就是继承自多个父类白,啧啧啧~

>>> class Teacher():
... def __init__(self,class): //敲了好几遍才意识到这个class还不能用。讲究~
File "<stdin>", line 2
def __init__(self,class):
^
SyntaxError: invalid syntax
>>> class Teacher():
... def __init__(self,grade): //换了grade就ok了
... print(grade)
...
>>> class Student():
... def __init__(self,age):
... print(age)
...
>>> stu = Student(19)
19
>>> tec = Teacher(10) //验证了一下没毛病 >>> class School(Teacher,Student):
... def __init__(self,grade,age,name):
... print(name)
... Student.__init__(self,age)
... print(age*10)
... Teacher.__init__(self,grade)
... print(grade*10)
...
>>> Tsinghua = School(10,19,"ocean") //还是只要别继承父类没有的属性就可以为所欲为
ocean
19
190
10
100
  • 多态
//上代码
>>> type(Cat)
<class 'type'>
>>> type(ins2)
<class '__main__.Cat'> //ins2是Cat类型的数据
>>> type(ins0)
<class '__main__.Animal'> //ins0是Animal类型的数据 >>> isinstance(ins2,Cat) //ins2属于Cat类,of course
True
>>> isinstance(ins0,Animal) //ins0属于Animal类,of course
True
>>> isinstance(ins2,Animal) //ins2同样属于Animal类!它继承自父类。
True //这就是所谓的多态
  • 多态的好处
>>> def run_twice(animal):	//此函数接受一个Animal类型的变量
... animal.printf()
... animal.printf()
...
>>> run_twice(Animal()) //运行成功,但是为什么定义的时候接受的类名是小写?
This is a Animal
This is a Animal >>> def run_twice(Animal): //大写是可以的
... Animal.printf()
... Animal.printf()
...
>>> run_twice(Animal())
This is a Animal
This is a Animal >>> run_twice(Dog()) //我们定义的时候没有定义Dog类,但是他是继承自Animal的,具有多态
This is a Animal
This is a Animal
>>> run_twice(Cat())
This is a cat.
This is a cat.
//由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的
run()方法,这就是多态的意思:
//对于一个变量,我们只需要知道它的父类,而不需要确切的知道子类的内部结果,就可以通过调用父类的方法
来调用子类的相对应的方法。
//这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方
法编写正确,不用管原来的代码是如何调用的。

Questions:

>>> class Animal():
... def printf(self):
... print("This is a animal.")
...
>>> class Dog(Animal):
... pass
...
>>> class Cat(Animal):
... def printf(self):
... print("This is a cat.")
...
>>> def run(Cat):
... Cat.printf()
...
>>> run(Cat())
This is a cat.
>>> run(Animal())
This is a animal.
>>> run(Dog()) //我都凌乱了,run函数定义的是Cat类,怎么会和Dog类还有父类产生关系?
This is a animal.
>>> ins0 = Animal()
>>> ins2 = Cat()
>>> isinstance(ins0,Cat)
False
  1. python super()函数回顾
  • super() 函数是用于调用父类(超类)的一个方法。(多继承问题
  1. 对实例类进行调用

TensorFlow2 Part2:基础知识回顾的更多相关文章

  1. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  2. C#基础知识回顾-- 反射(3)

    C#基础知识回顾-- 反射(3)   获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...

  3. C#基础知识回顾-- 反射(1)

    C#基础知识回顾-- 反射(1)   反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...

  4. C#基础知识回顾--线程传参

    C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...

  5. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  6. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  7. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

  8. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

  9. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  10. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

随机推荐

  1. UIViewContentModel图解+文解

    typedef NS_ENUM(NSInteger, UIViewContentMode) { //图片拉伸填充至整个UIImageView(图片可能会变形),这也是默认的属性,如果什么都不设置就是它 ...

  2. 吴裕雄--天生自然HADOOP学习笔记:基本环境配置

    实验目的 学习安装Java 学习配置环境变量 学习设置免密码登陆的方法 掌握Linux环境下时间同步的配置 实验原理 1.Java的安装 java是大数据的黄金语言,这和java跨平台的特性是密不可分 ...

  3. luffy 那点事

    1 虚拟环境创建 2 后台:Django项目创建 3 后台配置 4 数据库配置 5 user模块User表 6 前台 7 前台配置 8 前端主页 9 后端主页模块设计 10 xadmin 后台管理 1 ...

  4. jQuery设置input的type属性

    $("#inputName").attr("type","text");

  5. 第一章、ssh安装及远程登入配置

    1.Ubuntu下 确认 SSH Server 是否启动 输入: sudo ps -e | grep ssh. 如果正确启动, 命令行中会显示sshd. 安装服务端 OpenSSH Server 输入 ...

  6. 产品原型 UI 设计工具

    产品原型设计工具 Balsamiq Mockups Axure RP 图像处理.绘制工具 ps,AI 跨平台 UI开发工具 QT , Unity3D

  7. sklearn调用逻辑回归算法

    1.逻辑回归算法即可以看做是回归算法,也可以看作是分类算法,通常用来解决分类问题,主要是二分类问题,对于多分类问题并不适合,也可以通过一定的技巧变形来间接解决. 2.决策边界是指不同分类结果之间的边界 ...

  8. P1068 万绿丛中一点红

    P1068 万绿丛中一点红 转跳点:

  9. 如何修改 app.config 的配置信息

    如何修改 app.config 的配置信息 收藏 最问这个问题的人有点多,其实 .Net 提供了这样的功能我们可以在 app.config 中 userSettings 节点中保存我们的应用程序设置信 ...

  10. 软件构造 Lab1

    大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...