Python自学入门笔记#函数.4(模块、包、类)

1. 模块 Module

什么是模块?
模块是一个包含有一系列变量、函数、类等组成的程序组。
模块是一个文件,模块的文件名通常以.py结尾。

*.py --> *pyc --> *pyo --> pvm
*.c --> *.i --> *.s --> *.o --> bin

【作用】
让一些相关的变量、函数、类等有逻辑的组织在一起,让逻辑结构更加清晰。
模块中的变量、函数和类等可供其他模块或程序使用。

【分类】
1. 内置模块(builtins),在解析器的内部可以直接使用;——指定python版本后就固定了
2. 安装的标准库模块,安装Python时已安装具可直接使用;
3. 第三方模块(通常开源),需要自己安装;
4. 用户自己编写的模块(可以作为其它人的第三方模块)。

1.1. 模块的导入

1.1.1. import 语句

语法:

import 模块名1 [as 模块新名1], 模块名2 [as 模块新名2], …

作用:
将某模块整体导入到当前模块
import语句用法:

模块名.属性名

import XX as X ——————>可以将复杂模块名字简写,简化在程序调用过程中的输出

例如:math.sin(3.14)

help(obj) 函数,可以查看模块相关的文档字符串
dir(obj) 函数,返回模块所有属性的字符串列表

1.1.2. from import语句

语法:

from 模块名 import 模块属性名1 [as 属性别名1], 模块属性名2 [as 属性别名2], …

作用:
将某模块内的一个或多个属性导入到当前模块
示例:
from math import factorial as fac

1.1.3. from import * 语句

语法:

from 模块名 import *

作用:
将某模块所有属性导入到当前模块
示例:
from math import *

1.2. 自定义模块的编写

在项目中,自行编写模块并根据需要进行调用。
例:

#Example_1

# file : mymod.py
def fac(n):
	print("正在计算n的阶乘...")

def sum_fac(n):
	print("正在计算阶乘的和...")

name1 = 'audi'
name2 = 'tesla'


#file : test_mymod.py
import mymod

mymod.fac(30)
mymod.fac_sum(30)

print("name1 :", mymod.name1)

from mymod import fac as f

f(100)

from mymod import *
sum_fac(200)

1.2.1. 模块的搜索路径

import 模块名 #对应 模块名.py 去哪儿找

【查找的顺序】

  1. 搜索内置模块
    sys.builtin_module_names
  2. sys.path提供的路径
  3. 搜索程序运行时路径(当前路径)

【PYTHONPATH 环境变量】
此环境变量的值会在Python3的解析器启动时自动加载到 sys.path列表中

$ export PYTHONPATH=$PATHONPATH:/home/smart
Linux/Unix 用命令 printenc来查看所有的环境变量

1.2.2. 模块的加载过程

1.在模块导入时,模块内所有语句会执行。
2.如果一个模块已经导入,则再次导入时,不会重新执行所有的语句。

1.2.3 模块的属性

1.2.3.1. name 属性

用于记录模块自身名字
1.对于被导入模块,模块名为去掉路径前缀和“.py”后缀的文件名。
2.对于被执行的主模块,模块名为’main

【作用】
1.记录模块名
2.用来判断是否为主模块

1.2.3.2. __doc__属性

用来绑定模块的文档字符串
模块的文档字符串是模块中第一行出现的没给赋值给变量的字符串

1.2.3.3. __all__属性

【作用】
当用from import * 语句导入模块时,只导入__all__列表内的变量(属性)

__all__属性时用来存放可导出属性的列表

1.2.3.4. __file__属性

__file__属性用来记录模块对应的文件路径名

1.2.3.5. 模块的隐藏属性

模块中以’_‘或’‘开头,不以’'结尾的属性,在用from import *语句导入时,将不被导入到其他模块。
————>类似于私有

2. 包(模块包)package

【定义】
包是将模块以文件夹的组织形式进行分组管理的方法。

【作用】
将一系列模块进行分类管理,有利于防止名字冲突。
可以在需要时加载一个或部分模块而不是全部模块。

【包的加载】
import 包名 [as 包别名]
import 包名.模块名 [as 模块别名]
import 包名.子包名.模块名 [as 模块别名]

from 包名 import 模块名 [as 模块别名]
from 包名.子包名 import 模块名 [as 模块别名]
from 包名.模块名 import 变量名 [as 变量别名]
...

from 包名 import *
from 包名.模块名 import

2.1.包内__init__.py文件

【作用】
在包被加载时自动调用。
1.在内部填写包的文档字符串。
2.加载此包所依赖的一些模块或其他包

init.py 内的__all__属性
【作用】
当用from import * 语句导入模块时,只查找__all__中所列出的模块

__all__属性只在from import *语句中起作用

3. 面向对象编程

【什么是对象?】
一切皆对象
对象拥有性质和行为(对应成员变量和成员方法),统称为属性。

3.1. 类 class

类是对拥有相同属性和行为的一类对象的抽象描述。

【对象(object)/实例(instance)】
对象是类的实例。

类和对象的关系,就像别墅设计图纸和一座具体的别墅。
所有按照这张图纸建造的别墅都是对象,具体到某一座别墅时,这个别墅就是一个实例。

3.1.1. 类的创建

Class 类名 (继承列表):
‘类文档字符串’
实例方法(类内的函数method) 定义
类变量(class variable)定义
类方法(@classmethod)定义
静态方法(@staticmethod) 定义

注:[]内容可以省略

【作用】
可以用类来创建对象(实例)
类内定义的变量和方法能被此类所创建的所有实例共同拥有
类通常用来创建具有共同属性的对象(实例)

3.1.2. 实例化对象的成员变量

【定义语法】

self.变量名 #一般是在__init__函数中定义,赋值通过实参传递

【调用语法】

实例.变量名

【在模块中调用】

模块名.实例.变量名

#Example_1
class Dog:
	def __init__(self,k,c,a):
		self.kinds=k
		self.color=c
		self.age=a
d1=Dog("哈巴", "白色", 1)
print(d1.kinds, d1.color, d1.age)

3.1.2. 实例方法

【语法】

class 类名(继承列表):
	def 实例方法名(self, 形式参数1,形式参数2, ...):
		"文档字符串"
		语句...

【说明】
1.实例方法的实质是函数,是定义在类内的函数
2.实例方法属于类的属性
3.实例方法的第一个参数代表调用这个实例方法的对象,一般命名为“self”
4.实例方法如果没有return语句,则返回None
【实例方法的调用语法】
实例.实例方法名(调用参数)

类名.实例方法名(实例,调用参数)

3.1.2.1 构造方法

【作用】
创建对象时初始化实例变量
【语法】
def init(self[,形式参数列表]):
语句。。。
【说明】
1.构造方法名必须为 init ,不可改变
2.在一个类中只能有一个__init__构造方法(有多个时,最后一个起作用)
3.构造方法会在实例创建时自动调用,且将实例自身通过第一个参数self传入__init__方法
4.构造方法如果没有return语句,则返回self自身

3.1.2.2 析构方法

析构方法会在对象销毁时被自动调用
python语言不建议在对象销毁时做任何事情,因为该方法的调用时间难以确定。

class 类名:
del(self):
pass

3.1.3. 一些属性(预置实例属性)

【__dict__属性】
每一个对象(实例)都有一个__dict__属性
__dict__属性绑定一个存储此实例自身属性的字典

【__doc__属性】
用于保存类的文档字符串,用于help()中显示
实例的文档字符串和类的文档字符串相同

【__class__属性】
__class__属性绑定创建此对象(实例)的类对象(类实例)

3.2. 类变量

1.是指在类class 内定义的变量,此变量属于类,不属于此类的对象(实例)
2.类变量,可以通过该类直接使用
3.类变量,可以通过类的实例直接访问
4.类变量,可以通过此类的对象的__class__属性间接访问

3.3. 类方法

1.类方法时只能访问类变量的方法。
2.类方法需要使用@classmethod装饰器定义
3.类方法的第一个参数是类的实例,约定写为cls
【说明】
类实例和对象都可以调用类方法
类方法不能访问实例变量。
【类方法和实例方法对比】
1.类方法能够访问类变量,不能访问实例变量
实例方法能够访问类变量,也能够访问实例变量
2.类方法可以用实例来调用,也可以用类调用
实例方法在调用时必须穿入实例。

3.4. 静态方法@staticmethod

1.静态方法是普通的函数
2.定义在类的内部,只能凭借该类和实例调用
3.需要使用@staticmethod装饰器定义
4.静态方法与普通函数定义相同,不需要传入self实例参数和class参数

【说明】
类实例和对象实例都可以调用静态方法
静态方法不能访问类变量和实例变量。

3.5. 方法总结

1.不想访问类变量和实例变量(属性),用静态方法
2.只想访问类内变量,不想访问实例属性,用类方法
3.既想访问类内变量,也想访问实例变量用实例方法,用实例方法。

3.6. 特性属性@property

用来模拟一个属性
通过@property装饰器可以对模拟属性赋值和取值加以控制
实现其他语言所拥有的getter和setter功能

3.7. 类的__slots__属性

【作用】
1.限定一个类创建的实例只能有固定的实例属性
不允许对象添加列表以外的实例属性
2.防止用户因错写属性名称而发生程序错误

【说明】
__slots__属性是一个列表,列表的值时字符串
含有__slots__属性的实例所创建的实例对象没有__dict__属性,即此实例不用字典来存储属性

3.8. 对象的管理属性

函数
	1.getattr(obj, name [, default]) 从一个对象得到对象的属性,getattr(x, 'y')等同于x.y;
	当属性不存在时,如果给出default参数,则返回default,如果没有给出default,则产生一个AttributeError错误。
	2.hasattr(obj, name)用给定的name返回对象obj是否有此属性,可以避免getattr()函数引发错误
	3.setattr(obj, name, value)给对象obj的名为name的属性设置相应的值,set(x, 'y' ,v)等同于x.y=v
	4.delattr(obj, name) 删除对象obj的name属性,delattr(x, 'y')等同于 del x.y

3.8. 用于类的函数

1.isinstance(obj, 类或类的元组) 返回这个对象obj是否为某个类或某些类的对象,如果是,返回true,否则返回false
2.type(obj) 返回对象的类型
3.id函数
id(obj) 返回对象的标识(identity)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值