1、 包与模块管理以及面向对象初步认识
什么是模块呢? 答:把一些功能逻辑写到一个后缀名为py的文件里面,我们就成为这个文件为一个脚本,或者是一个模块。那么我们使用的原因是什么? 1、 代码重用 2、命名空间 3、实现数据的共享!
模块与模块之间是可以相互调用的!这时候我们需要使用三个关键字:
1、import 关键字 , 将想要使用的模块 : import 模块名 导入到目前的模块中!然后使用“模块名,”的形式来进行调用该模块的方法就行。
2、 from 关键字 :当你想要使用另外的模块的其中的一个属性的时候,我们就需要使用form关键字了!比如 from 想要使用的模块名 import 想要使用的模块中的变量 。 或者* 是导入所有。
如果在两个模块中有重名的方法,我们饿怎么办呢?要么使用模块名点方法的方式指定! 要么就使用“from 模块名 import 方法名 as 别名” , 通过起别名的形式来指定不同的模块中相同的名字 的不重复的调用。
模块执行的步骤:
1.、找到模块的文件!
2、将模块编译成为字节码文件!
3.、运行模块文件!
模块的搜索范围,比如一个math模块的使用的时候的顺序: 1、当前程序的主目录,2、找环境变量里面 3、找标准库中的! 4、扩展库中找!
注意:当我们在一个模块一中已经写好了两个方法,然后模块二导入以后使用模块一! 这个时候,模块一中又修改了这个方法,增加了新功能!这个时候模块二还要重新启动! 如果改动的多了!很是麻烦!
这时候我们的标准版库中已经考虑到这个问题了! 有一个专门负责导入的这种问题的! 叫 import importlib 这个库里面! 里面有一个方法 叫 importlib.reload(模块名) 这个的意思就是!他已经将模块的信息加进去了! 但是importlib只能以为模块为单位。
包的概念:
包就是创建的文件夹,我们在里面使用py文件,统一管理! 当需要导入这个包下面的某一个模块的时候! 只需要:
import 包名.类名 就可以了! 当我们在使用创建了包的时候,会在这个包下面出现一个__init__的py文件,这个文件就是使用这个文件的时候,初始化用的! 就是谁要是使用这个包,肯定会先初始化里面的代码! 这个东西只在第一次执行的时候被调用!
面向对象的概念:
封装的主要目的就是:最高程度上提高代码的重用性,最小限度的降低代码的冗余!
#coding=gbk
title = 'python入门'
price = 39.00
autor = 'Perter'
def search_book(title):
print('搜索包含书关键字{}的图书'.format(title))
book = {
'title':'Python入门',
'price':39.00,
'author':'Perter',
'search_book':search_book
}
print(book['title'])
print(book.get('price','没有价钱'))
book.get('search_book')('python')
上面的book就是一个面向对象的例子!使用字典表来完成。
学好面向对象编程的三要素:
1、分析对象(抛开代码):OOA(面向对象分析)。就是把你关心的东西列出来,万物皆对象,不管是看的见的看不见的但是能被人感知的东西,将对象的我们需要关注的特征定义出来!如果有多个对象! 就把这些对象一一的列举出来。然后屡清楚这几个对象之间的关系。哪个可以成为父类了~之类的
2、类定义对象代码模块(蓝图):OOD(面向对象设计)java中是class关键字! 各个语言都相差不大!
3、实例化(内存对象):OOP面向对象编程 :
上面的三步是我们的概念:下面三步是实现:
1、分析对象的特征和行为
2、写类描述对象的模板!
3、实例化,模拟过程:
接下来看一下具体的例子:
#coding=gbk
import datetime
# __init__是称之为构造函数,初始化类成员用的!
#当我们在类中定义函数的时候总是会被默认加上一个self,这句话的
#的意思就是:这句话需要你new出来的这个实例去调用 。
#当然这个也是可以去掉!也是可以修改的!但是这是我们在最后有需求的时候才会去修改的
# self 后面跟的参数! 那些都是一些默认值!就是当我们的参数没有传值的时候,就会默认使用的这个值,
#注意:这里有个现象,就是我们在当前参数赋予默认值以后,后面的参数都必须赋予默认值。
class Book:
def __init__(self,title,price = 0.0,author='',publisher=None,pubdate=datetime.date.today()):
self.title = title
self.price = price
self.author = author
self.publisher = publisher
self.pubdate = pubdate
def print_info(self):
print('当前这本书的信息如下:')
print('标题:{}'.format(self.title))
print('定价:{}'.format(self.price))
print('作者:{}'.format(self.author))
print('出版者:{}'.format(self.publisher))
print('出版时间:{}'.format(self.pubdate))
book1 = Book('C#经典',29.9,'Tom','梦想秀',datetime.date(2018,11,26))
book1.print_info()
book2 = Book('Python 入门精通')
book2.print_info() #没有定义的会使用默认值
注意看注释啊!!!!!!! 下面是输出的结果!可以看出来没有定义的使用了默认值
E:\python\python.exe E:/pythonstudy/pycharm/test/Day16/main.py
当前这本书的信息如下:
标题:C#经典
定价:29.9
作者:Tom
出版者:梦想秀
出版时间:2018-11-26
当前这本书的信息如下:
标题:Python
定价:0.0
作者:
出版者:None
出版时间:2018-11-26
请注意:当我们在命令式交互符上面输入这个类的时候,会出现这个类所在内存的地址值! 那么我们现在有一个需求:
就是在交互式命令提示符上面输入这个类的时候,直接打印该类的内容而不是地址值应该怎么做呢! 很简单!我们只需要使用默认的 __repr__(self): return ‘<图书 {}>.format(self.title)’ 这样我们在使用直接查看book的时候就会默认出现这行代码!