包与模块管理
在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。
为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。
例如
import math #就是引入math这个模块
#我们就可以使用math这个模块下的变量 常量 还有函数
print(math.pi)
3.141592653589793
只引入一个成员变量的方法:from xxx(模块名) import xx(变量或函数)
举例
from math import pi
print(pi)
3.141592653589793
对应的*可以引入所有成员变量及方法
from math import *
避免重名
加入as
模块运行步骤及搜索优先级
注意:使用
搜索范围 自己写的优先
why
代码重用 命名空间 实现数据和服务共享
面向对象思想
常见概念:
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
方法:类中定义的函数。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
类定义:
面向对象的三大特性:
1.继承:解决代码的复用性问题
2.封装:对数据属性严格控制,隔离复杂度
3.多态性:增加程序的灵活性与可扩展性
写一个类
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
#print方法
def __str__(self):
return self.name
def __repr__(self):
return '学生'+self.name
student = Student('小吴',12)
print(student)
小吴
类里面添加一个方法
class Student:
def __init__(self,name,age,subject='信息工程'):
self.name=name
self.age=age
self.subject=subject
#print方法
def __str__(self):
return self.name
def __repr__(self):
return '学生'+self.name
#方法定义
def getsubject(self):
print(self.subject)
student = Student('小吴',12)
student.getsubject()
信息工程
@property注解
@property
def getsubject(self):
return self.subject
student = Student('小吴',12)
print(student.getsubject)
信息工程
继承
class member(Student):
def __init__(self,name,age,subject,department='文学社'):
Student.__init__(self,name,age,subject)
self.department=department
def getsubject(self):
return '我的专业是'+self.subject
m = member('小王',12,'软件','美术社')
print(m.getsubject())
print(m)
我的专业是软件
小王
类的专有方法:
init : 构造函数,在生成对象时调用
del : 析构函数,释放对象时使用
repr : 打印,转换
setitem : 按照索引赋值
getitem: 按照索引获取值
len: 获得长度
cmp: 比较运算
call: 函数调用
add: 加运算
sub: 减运算
mul: 乘运算
truediv: 除运算
mod: 求余运算
pow: 乘方
在这里插入代码片
类常量的定义可以直接写在类里面,不用写在init里init针对实例化
这里的是针对这个类的变量
多态
def 父类:
def 父类方法:
pass或逻辑#定义标准
子类对父类方法重写
定义不同对象使用不同的方法,即多态
小结:
-----------------------------------------------分割线------------------------------------------------------------
函数,模块及方法
1. if name == ‘main’:
这段代码的功能
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的
原理
每个python模块(python文件,也就是此处的test.py和import_test.py)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py);如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“main”等于当前执行文件的名称(包含了后缀.py)。进而当模块被直接执行时,name == 'main’结果为真。
系统变量 __name__ 注意下划线有两个
例如:
在model下执行
得到结果:
这时候将model.py作为模块导入到另一个文件中使用
结果:
参考于https://blog.csdn.net/zhusongziye/article/details/79505803
import importlib
考虑到性能的原因,每个模块只被导入一次,放入字典sys.module中,如果你改变了模块的内容,你必须重启程序,python不支持重新加载或卸载之前导入的模块.刚刚也在模块步骤调用中写过模块编译成字节码文件后,
运算符的优先级
** 优先级比 * 优先级要高
逻辑运算优先级
从左到右 not and or