python_理解篇_钩子方法的理解

2019-08-22  本文已影响0人  金鱼座

大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!

钩子方法,是一个比较奇怪的东西, 他实际上不做任何业务操作,主要用于后期注册函数然后引用

举个爪子

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@File  : hook_jack.py
@Author: JACK
@Date  : 2019/8/22
@Des   :
"""

class HookMethodClass(object):

    def __init__(self):
        self.hook_method = None


    def register_method_hook(self, method):
        self.hook_method = method

    def play(self):
        if self.hook_method == None:
            print("未接受到注册方法")
        else:
            print("接受到了方法")
            self.hook_method()


def hooked_method():
    print("我是一个业务方法,需要注册使用")


if __name__ == "__main__":
    pass
    hooka = HookMethodClass()
    hooka.register_method_hook(hooked_method)
    hooka.play()

显示的结果:


result

从上述对比中发现,实际上钩子方法就是里面的register方法, 这样的方式可以在一些特定的场景中,灵活扩展类的对象操作方式,

例如A同学,B同学,都在看书,一个在看语文,一个在看英语中场景

在日常的类设计中,我们会设计如下结构

class Student():
  
  def read():
    pass

但是这种方式就会有一个问题,就是我只有读的对象行为,但是我没有读的目标展示,针对这种情况,我们实际上就可以考虑使用钩子方法

class Student_Hook():
  def __init__(self, read_book):
    self.read_book = None
  def reg_book(self, book):
    self.read_book = book

  def read():
    if self.read_book  is not None:
        self.read_book()
    else:
        pass
def book_A():
  pass

def book_B():
  pass

可以了, 如上图, 当然案例可能并没有充分体现出钩子的更加综合的体验,但是从理解来说,我们知道,钩子就等于是将两个方法通过一种关联方法,实现相关的引用,就想案例中的reg_book,通过这种关联引用,来达到read中的只需要判断是否有方法,有就执行,没有就不执行,而不用去人为if判断是A,B,然后对应去执行bookA和BookB

上一篇 下一篇

猜你喜欢

热点阅读