2019.8.20
面向对象进阶
一、@property装饰器
★ 装饰器就是不改变原函数的作用而额外增加的新功能
★ 我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。
class Person(object):
def __init__(self,name,age):
self._name = name
self._age = age
# 访问器 - getter方法
@property
def name(self):
return self._name
# 访问器 - getter方法
@property
def age(self):
return self._age
# 修改器 - setter方法
@age.setter
def age(self, age):
self._age = age
def play(self):
if self._age <= 16:
print('%s正在玩飞行棋.' % self._name)
else:
print('%s正在玩斗地主.' % self._name)
def main():
person = Person('王大锤', 12)
person.play() # 王大锤正在玩飞行棋.
person.age = 22 # 王大锤正在玩斗地主.
person.play()
# person.name = '白元芳' # AttributeError: can't set attribute
if __name__ == '__main__':
main()
二、__slots__魔法
★ __slots__约束类中的方法中的属性。
★ __slots__的限定只对当前类的对象生效,对子类并不起任何作用。
class Person(object):
# 限定 Person对象只能绑定_name, _age和_gender属性
__slots__ = ('_name', '_age', '_gender')
def __init__(self, name, age):
self._name = name
self._age = age
......
进程和线程
一、概念
● 进程:就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间。
● 线程:一个进程还可以拥有多个并发的执行线索,简单地说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。
练习:
# 先走装饰器A() --> deco --> func:A --> return warp() -->'hahaha'
def deco(func):
print(func)
print('lalala')
def warp():
print('hahaha')
return warp
@deco
def A():
print('Joker')
A()
(base) C:\Users\Administrator>F:/install/Anaconda/python.exe d:/VScode/Untitled-11.py
<function A at 0x0000000002842378>
lalala
hahaha
多进程:
def deco(func):
#print(func)
#print('lalala')
def warp():
print('登录失败')
return warp
@deco
def A():
print('Joker')
@deco
def B():
print('Joker2')
A()
B()
(base) C:\Users\Administrator>F:/install/Anaconda/python.exe d:/VScode/Untitled-11.py
登录失败
登录失败
#说明:func相当于A() B() 但是func没有返回值,所以不会输出‘Joker’和‘Joker2’
对比又返回func:
def deco(func):
#print(func)
#print('lalala')
def warp():
print('登录失败')
return func()
return warp
@deco
def A():
print('Joker')
@deco
def B():
print('Joker2')
A()
B()
(base) C:\Users\Administrator>F:/install/Anaconda/python.exe d:/VScode/Untitled-11.py
登录失败
Joker
登录失败
Joker2
在使用装饰器的情况下,无论输入什么验证码都会错误
import random
def deco(func):
def warp(n1,n2):
n1 = -1 #不管n2输入什么,n1都是-1,走esle语句-->'验证码错误'
return func(n1,n2)
return warp
@deco
def A(n1,n2):
if n1 == n2:
print('验证码正确')
else:
print('验证码错误')
num = random.randrange(1000,9999)
print('验证码是:%d'%num)
num2 = int(input('>>'))
A(num,num2)
(base) C:\Users\Administrator>F:/install/Anaconda/python.exe d:/VScode/Untitled-11.py
验证码是:4504
>>4504
验证码错误
无敌验证码
import random
def deco2(parms):
def deco(func):
def warp(*args,**kwargs):
if parms:
kwargs['n1'] = -1
return func(*args,**kwargs)
return warp
return deco
@deco2(True)
def A(n1,n2):
if n1 == n2:
print('验证码正确')
else:
print('验证码错误')
num = random.randrange(1000,9999)
print('验证码是:%d'%num)
num2 = int(input('>>'))
A(n1=num,n2=num2)
登录网页
多进程与多线程
说明:p.join()阻塞 先走子进程打印hello然后打印over