怎么导入sklearn包_4.5包
4.5包
前面我们已经听过包(package)这个概念了,比如String类在java.lang包下,Arrays类在java.util包下。那么为什么要引入包的概念呢?我们思考一个问题:java类库提供了上千个类,我们很难完全记住他们,如果我们编写了一个类,类名和类库中的某个类名字重复了怎么办?
其实一个操作系统的文件系统也会遇到类似的问题,那么windows系统如何解决的?这个你肯定知道,就是采用目录层次结构。我们把硬盘分成很多分区,例如c盘、d盘等,这个叫做根目录。然后再一级一级的建立文件夹,看图:
我们在workspace和workspace2下分别创建同名文件:hello.java,那么这2个文件的完整路径为:
D:\Java大失叔\workspace\hello.java
D:\Java大失叔\workspace2\hello.java
因此不会有冲突。
4.5.1包的概念
在Java中,是用包来解决这个问题的。包就类似于文件目录层次结构,是采用圆点(.)来分割,例如java.util。包类似于命名空间,我们平时说的类名,其实是类名的简写,一个类真正的名字是包名.类名,我们称之为完整类名。例如String类的的完整类名是java.lang.String,Arrays类的完整类名是java.util.Arrays。有了包之后,我们只需把我们自己编写的类放到我们自己的包中,这样即使类名和类库中的名字重复,也不会有冲突了(当然我们不建议这么做),例如我们也编写一个String类,放在我们自己的包javadashishu下,则我们的String类的完整类名是javadashishu.String,和java.lang.String不一样,就不会有冲突。
为了保证包名不冲突,针对包名我们会有一套推荐的命名方法,Sun公司的建议是:
包名都采用小写英文字母或数字,不能以圆点(.)开头或结尾
用倒置的域名作为包名前缀,例如
org.apache
com.google
子包名使用项目或功能的名字,尽量使用有意义的单词
尽量避免和JDK中的类同名
例如,笔者可以把《Java从入门到失业》的例子都放到包:com.javadss.javase下。
4.5.2创建包
我们已经了解了包的概念,那么怎么把一个类放到一个包下呢?下面们用Eclipse来演示创建类和包的过程,首先我们先创建本书第四章的包:com.javadss.javase.ch04。右键点击工程src文件,如下图:
在弹出的如下页面输入包名:
点击“Finish”按钮,我们发现,工程目录多了一个包,然后我们在包目录上点击右键,创建一个类PackageTest,Eclipse会自动生成代码如下:
package com.javadss.javase.ch04; public class PackageTest { }
我们发现,该文件的第一行多了一句代码:
package com.javadss.javase.ch04;
这句代码的含义就是表示该源文件中的所有类都将被放到包com.javadss.javase.ch04的下面。如果我们在该源文件中继续写一个类PackageTest2如下:
package com.javadss.javase.ch04; public class PackageTest { } class PackageTest2 { }
这样源文件PackageTest.java中的2个类PackageTest和PackageTest2 都被放到包com.javadss.javase.ch04中了。因此它们的完整类名分别为:
com.javadss.javase.ch04.PackageTest
com.javadss.javase.ch04.PackageTest2
假如我们的源文件开头没有声明包语句,那么这个源文件会被放置到一个默认包中,默认包是一个没有名字的包,像我们之前的例子,都没有声明包,因此它们都是放置在默认包中的。不过在实际运用中,非常不推荐把源文件放置在默认包中。
定义好了类的包后,我们看看这个源文件被放在什么地方了。笔者的Eclipse的工作空间目录为D:\Java大失叔\workspace,本书的工程为BaseJava,工程中src为源代码目录,bin为class文件目录。则最终源文件PackageTest.java的路径为:
D:\Java大失叔\workspace\BaseJava\src\com.javadss.javase.ch04\PackageTest.java
目录层次结构如下:
因为我们使用了Eclipse,它会自动帮我们编译类,还记得我们在3.1演示HelloWorld的时候教大家如何创建工程吗?Eclipse创建工程默认会使用项目文件目录作为根目录,下面会创建2个文件夹:src和bin。src用来存放源代码文件,bin用来存放编译后的字节码class文件。我们会发现,最终src和bin变成如下结构:
实际上,如果我们不用IDE,我们手工在src目录下编写上述源文件,然后用命令行工具编译(我们也编译到bin目录下),命令如下(还记得编译命令吗?红色表示编译后的class文件的目录,蓝色表示源文件的路径):
javac -d D:\Java大失叔\workspace\BaseJava\bin D:\Java大失叔\workspace\BaseJava\src\com\javadss\javase\ch04\PackageTest.java
编译成功后,也会在bin目录下形成上述结构。
4.5.3包作用域
上面我们说过包可以用来解决同名类的冲突问题,实际上,包还有一个作用,就是可以控制权限。
前面我们接触过访问修饰符public、private,其实还有一个protected,它们可以用来修饰类、属性及方法,当类、属性或方法不用任何访问修饰符修饰的时候,我们可以认为有一个default修饰符在修饰它们,这样一来,可以认为有4种访问修饰符,这4个修饰符可以控制对同一个类、同一个包、不同包的子类、不同包非子类的访问权限,下面我们用表格的形式列出它们的权限范围:
同一个类 |
同一个包 |
不同包子类 |
不同包非子类 |
|
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
|
default |
√ |
√ |
||
private |
√ |
我们看到,当不用任何修饰符修饰的时候,类、方法和属性对同一个包下的其他类是开放的。我们用一个例子演示一下,看如下2个类:
package com.javadss.javase.ch04; class PackageTest { private String sPrviate = "我是私有的"; String sDefault = "我是默认的"; void testYes() { System.out.println("同一个包可以访问我"); } private void testNo() { System.out.println("只有我自己可以访问我"); }}
package com.javadss.javase.ch04; class PackageTest2 { public static void main(String[] args) { PackageTest test = new PackageTest(); test.testYes(); System.out.println(test.sDefault); }}
我们看到,PackageTest和PackageTest2在同一个包中,因此PackageTest2可以访问PackageTest的testYes方法和sDefault属性,但是不能访问private修饰的testNo方法和sPrivate属性。
这里其实有一个问题,就是PackageTest2可以修改PackageTest的sDefault属性,其实对于有些情况来说,算是破坏了封装性。比如我编写了一个小工具类DssUtil提供给别人使用,包名是com.javadss.util。其中有很多默认修饰的属性,我本意是不想对外界开放。但是实际上使用者可以把他的类也放到包com.javadss.util中,这样他的类就可以随意访问DssUtil中的默认修饰属性了。不过这一点也有办法控制,后面我们有机会可以讨论包密封机制来解决这个问题(Java虚拟机从类加载上禁止加载用户自定义的以java.开头的类来解决这个问题)。
另外,还有一个问题需要注意,包并没有包含关系,例如对于包com.javadss.javase和com.javadss.javase.ch04这是2个包,因此这2个包下的类,不能互相访问默认作用域的类、属性和方法。
4.5.4包的导入
一个类可以访问同包中的所有类和其他包中的public类,如果需要访问其他类,需要导入以后才能访问。导入类有几种方式,我们一一介绍。
4.5.4.1直接写完整类名
第一种方式,是直接写完整类名。例如我们要使用Arrays类对一个数组排序,可以这样:
class PackageTest2 { public static void main(String[] args) { int[] a = new int[] { 4, 1323, 1, 33 }; java.util.Arrays.sort(a);//直接写完整类名 }}
但是这种方式显然是比较痛苦和令人讨厌的,一般我们采用下面这种方式。
4.5.4.2import语句
第二种方式就是用import语句导入。import语句可以导入某个特定的类或导入整个包。例如:
import java.util.Arrays;//导入特定的类
或者
import java.util.*;//导入整个包
使用import语句导入后,就可以不用写完整类名了。这里需要注意的是,导入整个包的方式,并不能把子包导入进来。一般情况下,我们推荐导入特定类的方式,这样可以直接看到某个类在哪个包下。
聪明的同学可能要问了,我记得我们之前一直使用System类来打印,但是好像也没有导入包啊?算你厉害,这里就牵涉到编译器在编译的时候,是如何定位类的:
如果是完整类名,则直接定位到该类
如果是简单类名,则按下面顺序:
从当前包下查找是否存在该类
从import语句中查找是否存在该类
从java.lang包中查找是否存在该类
看到了吗?实际上就相当于编译器会帮我们导入当前包和java.lang包下的类。因为System是java.lang包下的类,因此我们可以不必显式的导入。
有的时候还存在一个问题,当2个包下存在同名的类时,比如在JDK中存在java.util.Date和java.sql.Date,如果我们用了如下语句:
import java.util.*;import java.sql.*;
那么我们无法使用简单的类名Date。因为无法区分是用哪个包下的Date类。假如我们只使用其中一个,比如我们用java.util.Date,可以有一个取巧的办法:
import java.util.*;import java.sql.*;import java.util.Date;
但是这种办法解决不了我们同时需要使用2个Date类。如果同时需要使用的时候,只能用完整类名的方式了。
4.5.4.3静态导入
从Java5.0开始,增加一种新的导入方式,可以导入静态方法和静态属性。前面我们经常使用System.out.println()来打印,其实out就是System类的一个静态属性。如果我们在源文件进行如下导入:
import static java.lang.System.out;
这样我们就可以直接使用out.println()来打印输出了:
package com.javadss.javase.ch04; import static java.lang.System.exit; import static java.lang.System.out; class PackageTest2 { public static void main(String[] args) { out.println("静态导入"); exit(0); } }
注意看第3行,exit()是System的一个静态方法,这里不管这个方法有啥用,只是演示可以导入静态方法。当然,我们可以静态导入整个类的静态属性和方法:
import static java.lang.System.*;
不过说实话,我不太喜欢使用静态导入,有的时候反而引起一些阅读障碍。
4.5.5小结
通过本小结的讨论,我们知道:
包可以解决类名冲突,一个类的完整类名是包名.类名
在一个类中访问其他类,可以写完整的类名,也可以用import语句导入;从Java5.0开始还可以导入静态方法和静态属性。
包可以隔离访问权限,默认修饰的类、方法、属性可以被同包的其他类访问。
另外,包主要是让编译器知道如何定位到类,当编译成字节码class文件后,class文件中都是采用完整类名的方式来引用其他类。最后用一张图来总结一下:
怎么导入sklearn包_4.5包相关推荐
- 怎么导入sklearn包_在导入sklearn包是报错
相信大家经常会遇到这种情况,在导入sklearn包时或者其他包时报错ImportError: cannot import name __check_build 此种情况的原因一般为包之间不兼容的问题导 ...
- python哪里下载import包-【Python包】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- Pycharm 专业版 导入系统pip安装的包
Pycharm 专业版 导入系统pip安装的包 在setting 中找到project interpeter ,点击设置图标,点击Add,得到如图所示 选择 System Interpreter即可, ...
- python 导入sklearn时报错: no model named ‘murmurhash‘
今天在跑机器学习相关的代码,一小时前还好好的,一小时后突然在import sklearn这行代码上报错,报的就是没有murmurhash. 搜了半天也不知道这是个啥问题,而且明明不久前代码还好好的. ...
- python怎么导入sklearn_导入sklearn
所以我一直在尝试安装numpy,scipy和sklearn作为我正在学习的课程.经过许多问题和无数次尝试,我安装了pycharm并使用其内置的包管理器来获得numpy和scipy.我也安装了sklea ...
- Go 学习笔记(3)— 包概念、包特点、包名约束、main 包、包的声明、包的引用、包初始化
1. 包的概念 Go 语言是使用包来组织源代码的,并实现命名空间的管理.任何源代码文件必须属于某个包.源码文件的第一行有效代码必须是 package pacakgeName 语句,通过该语句声明自己所 ...
- 使用Python内置的smtplib包和email包来实现邮件的构造和发送
Python_sendEmail 使用Python内置的smtplib包和email包来实现邮件的构造和发送. 发送纯文本时: 1.需要导入Python3标准库中的smtplib包和email包来实现 ...
- android jar 加入图片,Android动态加载外部jar包及jar包中图片等资源文件
Android动态加载外部jar包及jar包中图片等资源文件 Android应用程序由Java开发,因此Java中许多实用的特性,在Android中也有体现.动态加载Class,也就是外部jar包,在 ...
- jar包和war包区别及理解
在开发阶段不适合使用war包,因为在开发阶段,经常需要添加或删除Web应用程序的内容,更新 Servlet类文件,而每一次改动后,重新建立war包将是一件浪费时间的事情.在产品发布阶段,使用war文件 ...
最新文章
- Android 趣味应用—— 短信编辑器
- redis服务器索引文件删除,Redis基本命令整理
- 举两个栗子:如何正确建立个人的机器学习项目集
- Another MySQL daemon already running with the same unix socket的解决
- 关于模板页调用js的问题
- Alex学Ruby[详解 block和Proc对象]
- java数据结构之递归算法
- 本周个人总结(软件的初步开发)
- 刘若英《爱情限量版》摘录
- 每天一道LeetCode----位运算实现加减乘除四则运算
- 第二篇 Python图片处理模块PIL(pillow)
- latex参考文献BibTeX的使用方法
- select, poll, epoll
- PyTorch 模型训练实用教程(附代码)
- 两个数和三个数的最大值和最小值宏定义
- linux开发屏幕保护代码,使用xscreensaver编写屏幕保护程序的提示和技巧?
- Unity实现音频播放器[QQ音乐,网易云等效果]
- 单片机串口通信的多字节传输
- 《我不是潘金莲》所揭示的
- 瑞吉外卖项目——修改分类
热门文章
- mysql+select阻塞ddl_MySQL 5.6中如何定位DDL被阻塞的问题
- python yield原理_从python的yield说起
- python最强脚本工具_8种常用的Python工具
- 物联网专科专业必修课程_江西自考专科物联网技术专业的考试课程/科目
- slam十四讲第二版 pdf_先搞定SLAM,再谈如何抓住下一代互联网产业爆发点!
- RegisterHotKey在XP系统下的运行问题
- win32 destroywindow函数
- rpm-tree源码分析一波
- Linux内存管理:Fixmaps(固定映射地址)和ioremap
- TLB的作用及工作原理,如何查看TLB miss?