一、import
和reload
和__import__
import是一个关键字,只引入一次
reload是一个函数,参数为一个字符串,它总是会重新引入__import__
是一个函数,与import关键字作用一样,它的好处就是可以动态引入包。因为import关键字后面只能跟确定的包名,而不能跟字符串参数,__import__
可以在程序运行时确定引入哪一个包
要使用reload函数,需要引入imp包。在python2中,reload是一个内置函数,在python3中移动到了imp模块中from imp import reload
二、doc string
以下代码意在告知如下知识点:
- __all__跟dir(模块名)是一对
- 在模块开头、类开头、函数开头,添加注释,即可使用help(module),help(className),help(functionName)查看doc string,也可以使用module.__doc__,fun.__doc__查看注释
"main module"
__all__ = ["A", "f"]
class A:
"this is class A"
def haha(self):
print("haha")
def f():
"""
F函数是最高级的函数
"""
pass
"main module"
__all__ = ["A", "f"]
class A:
"this is class A"
def haha(self):
print("haha")
def f():
"""
F函数是最高级的函数
"""
pass
三、vars 、locals是内置函数,用于查看当前作用域内包含哪些东西
四、类中定义变量是n+1份
class A:
cnt = 0
def __init__(self):
A.cnt += 1
self.cnt = A.cnt
a = A()
print(a.cnt,A.cnt) #1,2
b = A()
print(a.cnt,b.cnt,A.cnt) #1,2,2
a.cnt = 10
print(a.cnt,b.cnt,A.cnt) #10,2,2
class A:
cnt = 0
def __init__(self):
A.cnt += 1
self.cnt = A.cnt
a = A()
print(a.cnt,A.cnt) #1,2
b = A()
print(a.cnt,b.cnt,A.cnt) #1,2,2
a.cnt = 10
print(a.cnt,b.cnt,A.cnt) #10,2,2
上例中,类A、对象a、对象b中各维持一份cnt
五、staticmethod和classmethod
python中类有三种方法:实例方法、staticmethod、classmethod
实例方法第一个参数必须是self参数,classmethod第一个参数必须是cls参数,staticmethod就跟普通的类外面的函数没啥区别
三种函数有两个调用主体:类和对象
类和对象都可以随便调用这三种方法。
class A:
def haha(self):
print("haha")
@classmethod
def classHaha(cls):
print("class haha")
a = A()
A.haha(a) # 类调用实例方法
a.classHaha() # 实例调用类方法
a.classHaha(A) #报错:classHaha只有一个参数
class A:
def haha(self):
print("haha")
@classmethod
def classHaha(cls):
print("class haha")
a = A()
A.haha(a) # 类调用实例方法
a.classHaha() # 实例调用类方法
a.classHaha(A) #报错:classHaha只有一个参数
六、异常
try:
pass
except ZeroDivisionError: # 捕捉一个错误
pass
except (ArithmeticError, FloatingPointError) as e: # 捕捉多个错误,as e有没有都可以
pass
except: # 捕捉全部异常,也可以写成except Exception as e以获取参数
pass
else: # 如果没有异常抛出
pass
finally: # 不管有没有异常
pass
try:
pass
except ZeroDivisionError: # 捕捉一个错误
pass
except (ArithmeticError, FloatingPointError) as e: # 捕捉多个错误,as e有没有都可以
pass
except: # 捕捉全部异常,也可以写成except Exception as e以获取参数
pass
else: # 如果没有异常抛出
pass
finally: # 不管有没有异常
pass
七、动态函数参数
Python库中常见的一种结构是def f(*args, **kargs)
,运行一个小例子立马就明白了
"""
用*args,**kargs可以代表一切参数
"""
def f(*args, **kargs):
print(args, kargs)
f("one", 1, 2, 3, one=1, two=2)
"""
用*args,**kargs可以代表一切参数
"""
def f(*args, **kargs):
print(args, kargs)
f("one", 1, 2, 3, one=1, two=2)
-
*args
表示全部的不知名字的参数,**kargs
表示全部的知道名字的参数。 - 有名字的参数后面不能出现没名字的参数
-
*args
会吃掉全部的没名字的参数 -
def f(usr,*args,**kargs)
这种定义是合法的,usr只会吃掉第一个形参,args会吃掉它遇见的一切没名字的形参。