类的赋值与深浅拷贝
类的赋值
实际上指向的还是同一对象,只是用两个变量来表示。
class A:
pass
a = A()
b = a
print(a is b)
####
True
浅拷贝
Python拷贝一般都是浅拷贝。
class Cpu:
pass
class Disk:
pass
class Computer:
def __init__(self, cpu, disk):
self.cpu = cpu
self.disk = disk
cpu = Cpu()
disk = Disk()
c1 = Computer(cpu, disk)
import copy
c2 = copy.copy(c1)
print(c1, c1.cpu, c1.disk)
print(c2, c2.cpu, c2.disk)
####
可以看到,c1和c2是不同的对象,但是组成对象的子对象确实相同的。
3. 深拷贝
使用deepcopy来执行,组成对象的子对象是不同的。
c2 = copy.deepcopy(c1)
print(c1, c1.cpu, c1.disk)
print(c2, c2.cpu, c2.disk)
####
模块
一个py文件就是一个模块,可以包含类、函数、变量等。
# mymod.py
def fun():
print('mymod的fun()函数')
# main.py
import mymod
mymod.fun()
####
mymod的fun()函数
自定义模块
名称尽量不要与python自带的标准模块相同。
导入模块语法:
import 模块 [as 别名]
from 模块 import 类/函数/变量
查看math模块:
import math
print(dir(math))
####
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
以主函数的形式运行
每个模块都有一个名称__name__,如果一个模块没有导入到其他模块中,那么它有可能是顶级模块,顶级模块的__name__ = __main__
语法:
if __name__ == '__main__':
pass
包
包是一个分层次的目录结构,将一组功能相近的模块放到同一个目录下,包含__init__.py文件。
包的导入:import 包名.类名/函数名/变量名..
内置模块
import sys
import time
print(sys.getsizeof(0), sys.getsizeof(1))
print(sys.getsizeof(False), sys.getsizeof(True))
print(time.time())
print(time.localtime(time.time()))
####
24 28
24 28
1612779887.052952
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=18, tm_min=24, tm_sec=47, tm_wday=0, tm_yday=39, tm_isdst=0)
第三方模块的安装
使用pip install 模块来安装
文件
使用内置函数open()来创建文件对象,
常用文件打开方式
文件的常用方法
with语句
可以自动管理上下文的资源,无论发生什么跳出with块,都会释放资源。