Flask之路-前戏

Flask之路-前戏

以下内容都是学习Flask框架之前需要了解的知识点,敲黑板…

一. Flask前戏之装饰器

1.1 无参装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "shuke"
# Date: 2018/4/15

def wapper(f):
def inner(*args, **kwargs):
return f(*args, **kwargs)

return inner

# 1. 立即执行wapper函数,并且将被装饰的函数当作参数传递
# 2. 此时的func=inner
@wapper
def func(arg):
print(arg)


func(123)
'''
>>> 123
'''

2. 带参数的装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def outer(num):
def wapper(f):
def inner(*args, **kwargs):
return f(*args, **kwargs)

return inner

print(num)
return wapper


# 首先执行wapper(666),获得返回值;@wapper;此时@wapper,再执行wapper(func)函数,获得返回值inner,此时:func=inner函数
@outer(666)
def func(arg):
print(arg)

func('Hello')
'''
666
Hello
'''

4. 扩展

这里我们引入一个functools模块,这个模块是它能将装饰过的函数的特殊属性保留,对于这个functools.wraps装饰器,相当于wrapper = functools.wraps(func)(wrapper)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import  functools
def wapper(func):
@functools.wraps(func)
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
@wapper
def index():
print("hello world ,from index")
@wapper
def order():
print("hell world ,from order")

print(index.__name__)
print(order.__name__)
########## 使用functools.wraps(函数) #############
index
order
########## 不使用functools.wraps(函数)#####################
inner
inner

二. Flask前戏之面向对象

面向对象3大特性: 继承 封装 多态

  • 继承
    子类继承父类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Parent(object):
    def __init__(self):
    pass

    def talk(self):
    print("Say Hello!")


    class Child(Parent):
    def __init__(self):
    pass


    c1 = Child()
    c1.talk()
    '''
    >>> Say Hello!
    '''
    PS: 在python3.x中类的继承遵循广度优先原则,在python2.x中遵循深度优先原则
  • 封装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    1. 示例
    class Foo(object):
    def __init__(self, age, name):
    self.age = age
    self.name = name

    # 此处的18和'shuke'被封装到Foo类中
    f1 = Foo(18, 'shuke')

    2. 示例
    class Bar(object):
    def __init__(self, counter, obj):
    self.age = counter
    self.obj = obj

    # 此处的self.obj即为Foo类的对象f1
    b1 = Bar(1, f1)

    3. 示例
    class Bar(object):
    def __init__(self, counter):
    self.age = counter
    self.obj = Foo(18, 'shuke')

    # 此处的self.obj即为Foo类的对象
    b1 = Bar(1)
  • 多态
    鸭子模型

PS: 一个py文件中的函数可以被当作模块导入,在其他文件中调用即为封装思想

三. python中什么后面可以加括号

3.1 基本形式如下

1
2
3
4
5
6
7
def func(arg):
"""
由于arg在函数中加括号,所以基本上只有4中表现形式
:param arg:
:return:
"""
arg()

a. 函数

1
2
3
4
def f1():
print("f1")

func(f1)

b. 类

1
2
3
4
class Foo(object):
pass
# 执行类.__init__构造方法
func(Foo)

c. 方法

1
2
3
4
5
6
7
8
9
10
class F3(object):
def __init__(self):
pass

def example(self):
print("F3")


obj = F3()
func(obj.example)

d. 对象

1
2
3
4
5
6
7
8
9
10
11
12
13
class F4(object):
def __init__(self):
pass

def __call__(self, *args, **kwargs):
print("call方法")

obj = F4()
obj()
''''
>>> call方法
'''
func(obj)

延伸(函数与方法的区别)

1
2
3
4
5
6
7
8
9
10
11
12
13
class F3(object):
def __init__(self):
pass

def example(self):
print("F3")


obj = F3()
# 方法
obj.example()
# 函数
F3.example

科学依据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from types import MethodType, FunctionType

class F3(object):
def __init__(self):
pass

def example(self):
print("F3")

ret1 = isinstance(F3.example, MethodType)
ret2 = isinstance(F3.example, FunctionType)
print(ret1, ret2)

'''
>>> False True
'''

obj = F3()
ret3 = isinstance(obj.example, MethodType)
ret4 = isinstance(obj.example, FunctionType)
print(ret3, ret4)

'''
>>> True False
'''

本文标题:Flask之路-前戏

文章作者:shuke

发布时间:2020年04月20日 - 14:04

最后更新:2020年04月20日 - 14:04

原始链接:https://shuke163.github.io/2020/04/20/Flask%E4%B9%8B%E8%B7%AF-%E5%89%8D%E6%88%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------

本文标题:Flask之路-前戏

文章作者:shuke

发布时间:2020年04月20日 - 14:04

最后更新:2020年04月20日 - 14:04

原始链接:https://shuke163.github.io/2020/04/20/Flask%E4%B9%8B%E8%B7%AF-%E5%89%8D%E6%88%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%