Python基础3
成员变量(属性):
类属性:在类内直接定义的。
实例属性:通常会在构造函数中通过self去定义。
无论是类属性还是实例属性都可以随时添加。
成员函数(方法):
普通的方法:默认传递的是self 代表的是对象本身 可以访问实例属性
类方法:默认传递的是cls 代表的是类本身 可以访问类属性 不能访问实例属性
静态方法:没有默认参数 但是可以通过类名访问到类属性
类方法和静态方法区别并不大。通过需要访问类属性时,使用类方法,反之,使用静态方法。
权限控制:
_ 不应该在类外访问,推荐在类内或者子类的类内去使用 相当于时保护的成员
__ 不应该在类外访问,也不推荐在子类访问,相当于是私有的成员。会被修改名字,修改为
_类名__成员名
python中的权限控制,在语法并没有过多的限制。只是依靠大家的使用习惯。
继承:
python支持单继承,也支持多继承,只要在类名后的括号中写上父类的名字的就可以了。
super(子类名,self).成员
如果继承的时候出现了重名,造成了二义性,python会从下往上去寻找,找到的一个,就直接使用。
多态:
python天然支持多态,因为并没有参数类型的检查。只要对象有那个函数,就可以调用。
异常处理
try
raise 异常类型("抛出异常时的字符串信息")
except 异常类型 as info
得到此类型异常的时候,会执行这里
except ......
.....
finally
无论是否产生异常,都会执行finally中的语句。
高阶函数
filter(函数,列表) 将列表中的每一个元素传递到函数中,函数返回true,就将元素添加到新列表中
最终将新列表返回。
reduce(函数,列表) 将列表中的成员第一次取出2个,带入到函数计算。以后每次将计算的结果和列表中的下一个元素带入到函数中,直到所有元素都被使用过,最后将计算得到的值返回。
map(函数,列表) 将列表中的每一个元素传递到函数,计算,将计算结果组成一个新的列表。
这种函数一般都配合匿名函数使用
lambda 参数:返回值
闭包:
python是一个完全的面向对象语言。
函数也是一个对象
def outer(num):
a = num*2
def inner(test):
return a*test
#在返回函数对象的时候,函数对象会将此时的环境信息包裹在函数对象中一并返回
#这种行为称之为闭包
return inner
m = outer(10)
print(m(5))
装饰器
def w1(func):
def inner(a):
print("开始检测")
m = func(a)
print("收尾工作")
return m
return inner
@w1
def fun1(a):
print("复杂工作",a)
@w1
def fun2(b):
print("复杂工作",b)
@w1
def fun3(b):
print("复杂工作",b)
fun1(100)
@w1的作用就是
将w1下面的函数作用参数赋值给w1,然后将返回值返回给下面的函数。
@w1
def fun1():
...
fun1 = w1(fun1)
fun1()
时间模块:
import time
#获得时间戳
m = time.time()
print(m)
#将时间戳转换为元组信息
ti = time.localtime(m )
print(ti)
print(ti.tm_year)#也可以输出每一个字段
#将元组信息转换为字符串
#Y 年 m 月 d 日 H 时 M 分 S 秒
#转换的时候,不必写全,写什么就有什么
nowtime = time.strftime("%Y-%m-%d",ti)
print(nowtime)
print(time.strftime("%H-%M-%S",ti))
print(time.strftime("%Y-%m-%d-%H-%M-%S",ti))
li = nowtime.split("-")
print(li)
datatime模块
data
m = datetime.date.today() #可以是今天的日期
m = datetime.date(2019,6,5) #也可以是自定义的
print(m.timetuple())
n = m.replace(2018,1,5) #可以用replace构建一个新的
print(n)
time
m = datetime.time(9,23,4)
print(m)
print(m.strftime("%H--%M--%S"))
datetime
m = datetime.datetime.now()
print(m.timetuple())
print(m.strftime("%Y--%m--%d--%H--%M--%S"))
timedelta:专门用于时间计算的类
两个datatime对象相减 得到的就是timedelta对象
当想计算过了多少天 是什么日期,是礼拜几的时候,也需要用到这个对象
import datetime
m = datetime.datetime.now()
sub = datetime.timedelta(days=1)
n = m +sub #明天
print(n)
n = m-sub #昨天的这个时候
print(n)
sub = datetime.timedelta(days=365)
n = m+sub #明年
print(n)
随机:
在一个范围内生成随机数
import random
m = random.randrange(1,100)
print(m)
打乱序列
import random
li = [1,2,3,4,5,6,7,8,9]
random.shuffle(li) #打乱一个序列
print(li)
示例,生成随机验证码:
temp = ""
for i in range(0,6):
m = random.randrange(1,3)
if m==1:
n = random.randrange(1,10)#随机生成数字
temp+= str(n)
else:
n = random.randrange(65,90)#随机生成字符
temp+=chr(n)
print(temp)
示例:
#列出某一个文件夹下的所有内容
print( os.listdir("C:\\"))
#os.remove("D:\\123.txt")
m = os.path.isfile("D:\\123.txt")
print(m)
文件操作:
import os
f = open("D:\\123.txt","a+")
f.write("hello wrold")
f.close()
pyhton的多线程编程:
import threading
def loop():
while True:
print("--------我是子线程-------")
print(threading.current_thread().name)
th = threading.Thread(target=loop,name="hello 15PB")
th.start()
while True:
print("--------我是主线程-------")
多线程容易产生资源争抢问题,可能会对资源造成破坏。
解决这个问题的基本方式:
定义一个全局的锁(windows:临界区 互斥体 事件....)
上锁
操作共享资源的时候。
解锁
import threading
m = 0
lock = threading.Lock()
def loop1():
global m
global lock
for i in range(0,1000000):
lock.acquire()
m +=1
lock.release()
def loop2():
global m
for i in range(0, 1000000):
lock.acquire()
m += 1
lock.release()
th1 = threading.Thread(target=loop1,name="hello 15PB")
th2 = threading.Thread(target=loop2,name="hello 15PB")
th1.start()
th2.start()
th1.join()
th2.join()
print(m)