TensorFlow2 Part2:基础知识回顾
- 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
- python super()函数回顾
- super() 函数是用于调用父类(超类)的一个方法。(多继承问题)
- 对实例类进行调用
TensorFlow2 Part2:基础知识回顾的更多相关文章
- java基础知识回顾之---java String final类普通方法
辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /* * 按照面向对象的思想对字符串进行功能分类. * ...
- C#基础知识回顾-- 反射(3)
C#基础知识回顾-- 反射(3) 获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...
- C#基础知识回顾-- 反射(1)
C#基础知识回顾-- 反射(1) 反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...
- C#基础知识回顾--线程传参
C#基础知识回顾--线程传参 在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数, 也不能有返回值.如果希望传递参数给执行函数, ...
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- C++ 基础知识回顾总结
一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...
- scrapy实战1,基础知识回顾和虚拟环境准备
视频地址 https://coding.imooc.com/learn/list/92.html 一. 基础知识回顾 1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
随机推荐
- gets和scanf区别
scanf 和 gets 读取字符串 深入了解scanf()/getchar()和gets()等函数 scanf与gets函数读取字符串的区别 今天看到一段话,大致是说gets比scanf()快,有点 ...
- Ubuntu14 安装JDK 8
参考: [1]Ubuntu安装JDK7/JDK8 [2]Oracle官网安装JDK10 安装包安装 本文采用安装包安装方式 1.下载JDK安装包 JDK8下载 ,根据所使用系统选择安装包(这里选.ta ...
- Design and History FAQ for Python3
Source : Design and History FAQ for Python3 Why is there no goto? 你可以通过异常来获得一个可以跨函数调用的 "goto 结构 ...
- RadioButton 用法
@Html.RadioButton("rdoNotice", "1ST", true, new { id = "rdoFirstNotice" ...
- python如何画三维图像?
python三维图像输出的代码如下所示:#画3D函数图像输出from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmimport ...
- vue dialog每次打开会展示上一次数据(转载)
原文地址: (https://www.jianshu.com/p/82b6681d0768) 在dialog外套一层div,div中以v-if来控制组件el-dialog的出现与否,每次弹出el-di ...
- [转]网络协议-redis协议
Redis 通信协议(protocol) 本文档翻译自: http://redis.io/topics/protocol . Redis 协议在以下三个目标之间进行折中: 易于实现 可以高效地被计算机 ...
- rendering path定义了什么?有哪些?有什么作用?有什么限制?
rendering path 定义了光照在一个shader pass中处理的对象与顺序,如逐像素处理,逐顶点处理,向前处理,后向 deferred用于处理不透明物体,会先把它们根据深度检测,过滤后的内 ...
- jenkins 2.204.2 安装, 使用国内源安装, 并且跳过插件界面, 更新成国内插件源.
需要java环境支持,自行百度. jenkins 安装源在国外, 下载会比较慢, 尤其在linux下, 使用yum或者apt install jenkins方式安装时,经常会下载失败. 由于yum或者 ...
- python2学习------基础语法5(常用容器以及相关操作)
1.list(列表) #生成数据list a=[x for x in range(10)]; #print a; #遍历list for i in a: pass; #print i; #追加元素 a ...