模块
经常使用有:random,sys,os,math
- 一个文件即为一个模块
- py文件的无后缀的文件名就是模块名
- 使用模块名.变量名就可以在当前文件引用该变量
导入模块
-
第一种方式:直接导入模块名:import mycode
-
第二种方式:可以指定导入哪些变量或者函数、类
from mycode import var,show,A
-
可以使用*替代明确指定
from mycode import *
-
第三种方式,导入后取一个别名
from mydouble import MyFirstStudentClass as MyClass myclass = MyClass() myclass.myprint("ok") 复制代码
-
使用路径.语法从包中导入模块
-
创建目录,放上一个_init_.py文件 这个_init_.py可以为空,也可以为初始化的程序
有了_init_.py的文件夹叫做模块包from module1.module1 import * res = mysub(10,9) print(res) 复制代码
装饰器
#装饰器案例
DEBUG = True
def decorator_1(func):
def decorator_nest(*args, **kwargs):
print("调试装饰器")
print("调试状态")
print(args,kwargs)
print("*"*20)
return func(*args, **kwargs)
if DEBUG:
return decorator_nest
else:
return func
def login_required(func):
def decorator_nest(*args, **kwargs):
print("登录装饰器")
if "userid" not in kwargs:
print("您尚未登录,禁止访问")
return None
else:
print("欢迎回来")
return func(*args,**kwargs)
return decorator_nest
@login_required
@decorator_1
def myfun(*args,**kwargs):
print(args,kwargs)
myfun("hello","world",userid=10)
复制代码
递归&冒泡
递归函数实现斐波拉切数列
def fb2(num):
if num <= 0:
retrun
if num <= 2:
return 1
else:
return fb2(num-1) + fb2(num+1)
复制代码
冒泡排序
lists = [10,8,5,6,3,2,4,7,9,1]
for i in range(0, len(lists)):
print(lists[i])
for n in range(i, len(lists)):
if lists[i] < lists[n]:
lists[i], lists[n] = lists[n], lists[i]
print(lists)
复制代码
多态
多态就是同一种行为因为对象不同,执行方式不同
- issubclass(类1,(类…)——检查类1是不是其他类的子类
- isinstance(实例,类)——检查某个类是不是其他类的实例
元类
之前创建的类即是object的子类又是object的实例,是一个类类型的实例,object就是一个元类
所有的类其实都是创建的type的实例 type(类名,基本元组类型,包含属性与方法的字典类型)
class A:
pass
B = type("B", (A,),{'sex':1})
复制代码
- _new_的第一个参数是类的自身
- 从type继承
- 类可以动态创建
- _new_的方法用于动态创建类
class A(type):
def _new_(cls):
return type("B",(),{'sex':"BB"})
def _init_(self):
print(self)
a =A()
复制代码
- _new_的参数从第二个参数开始