zoukankan      html  css  js  c++  java
  • Python中的属性注册

      在阅读有些Python的开源项目源码时,会看到某些对象调用了一个方法,但在该对象当中却又找不到该方法。还可能会看到在调用某个方法是并不是直接调用而是使用了getattr这个方法;好在现在IDE比较智能,通常也还能够关联找得到该方法;
      调用对象本身没有存在的方法属性、间接调用方法,下面看看在Python中这是怎么回事;
      在Python中有不少内置函数,上面所说的功能正是通过它的内置看书实现的:使用了这么几个内置函数:setattr、getattr、hasattr函数;

    setattr函数

      字面意思,设置属性值,它的真实作业也只是设置函数值;但它可以给某个对象设置一个他不存在的属性并且赋值;

    class Ten:
        def __init__(self, data):
        print("init")
    
    def register(name, fn):
    setattr(Ten, name, fn)
    

      上面定义了一个类,该类并没有属性或除了init方法外其他的方法;定义一个register方法,该方法用于向Ten类中注册属性、方法;

    t = Ten()
    

    调用register方法,注册属性val,值为5;

    register("val", 5)
    print(t.val)
    

    打印输出注册的属性val值:5;

    定义一个新类:Ops

    class Ops:
        @staticmethod
        def add(x, y):
            return x + y
    

    在Ten类中注册ops属性,值为刚定义的类Ops;

    register("ops", Ops)
    value= t.ops.add(1, 2)
    print(value)
    

    此时可以通过注册的属性ops调用该属性的方法;

    getattr、hasattr函数

      getattr函数用于获取属性、hasattr用于检测某个属性是否存在;

    value = getattr(t, "val")
    print(value)
    

      获取上面注册的属性val,输出值为5;
    获取不存在的属性会抛出异常,此时可使用hasattr函数用于判断属性是否存在,再做下一步处理;

    hasattr(t,"mul")
    返回False
    hasattr(t,”va”)
    返回True
    

      了解了这几个函数,看到图中这种代码就可以秒懂了。

  • 相关阅读:
    vue 设置全局变量、指定请求的 baseurl
    npm ERR! missing script: build
    npm install 报错,提示`gyp ERR! stack Error: EACCES: permission denied` 解决方法
    vue-cli 4 安装与 新建项目 路由
    PHP7安装redis扩展
    C#中的list的System.Predicate<in T>和System.Comparison<in T>的应用
    6个2教你认识递归的力量!
    C#中的预编译指令介绍[转]
    C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]
    GOTO语句以及GOTO机制的模式实现
  • 原文地址:https://www.cnblogs.com/softlin/p/14053387.html
Copyright © 2011-2022 走看看