被python折磨的第五天

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
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值