zoukankan      html  css  js  c++  java
  • python 装饰器(八):装饰器基础(四)types.MethodType的作用

    1 types.MethodType的作用—添加实例方法

    import types
    
    class cla(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def prii(self):
            print("pri")
    
    def f1(self):
        print("f1")
    
    c = cla("zhangsan", 40)
    
    c.prii()
    
    c.f1=types.MethodType(f1,c)
    
    c.f1()
    
    xxx=types.MethodType(f1,c)
    
    xxx()
    pri
    f1
    f1
     ↑可以看到,xxx()一样可以正常的执行。所以这个动态添加的办法和原生的属性还是有所区别的。执行了types.MethodType(f1,c)之后,相当于产生了一个特殊返回值,这个返回值指向的f1的函数代码,里面已经被默认传递了c对象作为参数,只要使用这个返回值,就可以当做是调用了对象的方法。
      c.f1=types.MethodType(f1,c)这么写之后,再调用c.f1(),完全是为了字面上的符合,符合这个操作的原意而已。

    2 types.MethodType的作用—添加静态方法

    在使用静态方法时,类中的self将不会再进行传值,此时,静态方法已经和类没什么关系了。
      需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数。
    import types
    
    class cla(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def prii(self):
            print("pri")
    
    def f1(self):
        print("f1")
    
    #@符号,要想起装饰器!
    @staticmethod
    def test():
        print(":static")
    
    c = cla("zhangsan", 40)
    
    #这里不也不是必须叫cla.test,随便都可以
    cla.test=test
    cla.test()
    :static

    ↑这里不需要绑定,因为静态方法不需要任何的参数,只要赋值了就直接用。注意要使用类名来调用。

    3 types.MethodType的作用—添加类方法

    import types
    
    class cla(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def prii(self):
            print("pri")
    
    def f1(self):
        print("f1")
    
    @staticmethod
    def test():
        print(":static")
    
    @classmethod
    def clsm(cls):
        print("classmethod call")
    
    c = cla("zhangsan", 40)
    
    cla.clsm=clsm
    
    cla.clsm()
    classmethod call

    ↑类方法也是直接赋值调用就行。

      动态添加可以做到什么呢?一款APP,在没有进行整个APP的情况下,里面的部分功能变了。即我部分的功能代码存在一个文件中,我在后台默默更换这些文件,下次你再打开APP,对应的功能或者样式就变了。



  • 相关阅读:
    SQL 中不同类型的表连接
    分享一些不错的sql语句
    SQL Server 日期和时间函数
    Delete,Update与LEFT Join
    Excel 相对引用与绝对引用
    SQL Update 巧用
    Delphi 多步操作产生错误,请检查每一步的状态值
    003-mysql查询表的数据大小、索引大小
    002-导出表结构、数据字典、说明文档
    008-运维管理链码
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12985889.html
Copyright © 2011-2022 走看看