文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python内置方法和属性应用:反射和单例

2024-12-11 21:32

关注

1. 前言

python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。

2. 内置方法和函数介绍

    如果你需要遍历可迭代的对象,有需要获取它的序号,可以用enumerate, 每一个next返回的是一个tuple 

  1. list1 = [1, 2, 3, 4]  
  2.   list2 = [4, 3, 2, 1]  
  3.   for idx, value in enumerate(list1):  
  4.       print(idx, value, list2[idx])  
  5.   # 0 1 4  
  6.   # 1 2 3  
  7.   # 2 3 2  
  8.   # 3 4 1 
  1. # 给list加上序号  
  2.   b = [4, 3, 2, 1]  
  3.   for i in zip(range(len(b)), b):  
  4.       print(i)  
  5.   # (0, 4)  
  6.   # (1, 3)  
  7.   # (2, 2)  
  8.   # (3, 1) 
  1. @staticmethod    
  2.     def test():   
  3.         print('this is static method')  
  4.     Foo.test = test  
  5.     Foo.test() 
  1. class Foo():  
  2.        """this is test class"""  
  3.        def __init__(self, name):  
  4.            self.name = name   
  5.        def run(self):  
  6.            print('running')  
  1. # 列出类的所有成员和属性  
  2.  dir(Foo)  
  3.  ['__class__',  
  4.  '__delattr__',  
  5.  '__dict__',  
  6.  '__dir__',  
  7.  '__doc__',  
  8.  '__eq__',  
  9.  '__format__', 
  10.  '__ge__',  
  11.  '__getattribute__',  
  12.  '__gt__',  
  13.  '__hash__',  
  14.  '__init__',  
  15.  '__init_subclass__',  
  16.  '__le__',  
  17.  '__lt__',  
  18.  '__module__',  
  19.  '__ne__',  
  20.  '__new__',  
  21.  '__reduce__',  
  22.  '__reduce_ex__',  
  23.  '__repr__',  
  24.  '__setattr__',  
  25.  '__sizeof__',  
  26.  '__str__',  
  27.  '__subclasshook__',  
  28.  '__weakref__',  
  29.  'run']  
  30.  # 类的注释  
  31.  Foo.__doc__  
  32.  # 'this is test class'  
  33.  # 类自定义属性  
  34.  Foo.__dict__  
  35.  mappingproxy({'__module__': '__main__',  
  36.            '__doc__': 'this is test class',  
  37.            '__init__': <function __main__.Foo.__init__(self, name)> 
  38.            'run': <function __main__.Foo.run(self)> 
  39.            '__dict__': <attribute '__dict__' of 'Foo' objects> 
  40.            '__weakref__': <attribute '__weakref__' of 'Foo' objects>})  
  41.  # 类的父类  
  42.  Foo.__base__  
  43.  # 类的名字  
  44.  Foo.__name__ 

 类的实例化和初始化   

  1. # python类先通过__new__实例化,再调用__init__进行初始化类成员  
  2.     foo = Foo('milk') 

类的属性添加和访问   

  1. # 类的访问  
  2.    foo.name  
  3.    foo.run() 
  4.    # 可以通过setattr 动态的添加属性  
  5.    def method():  
  6.        print("cow")  
  7.    setattr(foo, "type", "cow")  
  8.    setattr(foo, "getcow", method)  
  9.    # cow  
  10.    foo.type  
  11.    foo.getcow()  
  12.    # 动态删除属性 delattr  
  13.    delattr(foo, "type")  
  14.    # getattr 获取成员属性  
  15.    if hasattr(foo, "run"): # 判断是否有属性  
  16.        func = getattr(foo, "run")  
  17.        func() 

3. 单例模式应用

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。单例模式要求在类的使用过程中只实例化一次,所有对象都共享一个实例。创建的方法是在实例的时候判断下是否已经实例过了,有则返回实例化过的全局实例。python是如何实现的呢?关键是找到实例化的地方,对就是前面说的__new__ 

  1. class Singleton(object):  
  2.     def __new__(cls, *args, **kwargs):  
  3.         if not hasattr(cls, '_instance'):  
  4.             cls._instance = object.__new__(cls)  
  5.         return cls._instance   
  6.     def __init__(self, name):  
  7.         self.name = name  
  8. a = Singleton('name1')  
  9. b = Singleton('name2')  
  10. print(id(a), id(b))  
  11. print(a.name, b.name)  
  12. # 1689352213112 1689352213112  
  13. # name2 name2 

4. 反射应用

反射在许多框架中都有使用到,简单就是通过类的名称(字符串)来实例化类。一个典型的场景就是通过配置的方式来动态控制类的执行,比如定时任务的执行,通过维护每个定时任务类的执行时间,在执行时间到的时候,通过反射方式实例化类,执行任务,在java中也非常的常见。

python的实现可以通过上面说的getattr获取模块中的类, 通过methodcaller来调用方法。我们来看一个简单的例子 

  1. import importlib  
  2. from operator import methodcaller  
  3. class Foo(): 
  4.      """this is test class"""  
  5.     def __init__(self, name):  
  6.         self.name = name   
  7.     def run(self, info):  
  8.         print('running %s' % info)  
  9. # 类所在的模块,默认情况__main__, 可以通过Foo.__dict__ 中'__module__'获取  
  10. api_module = importlib.import_module('__main__')   
  11. # getattr获取模块中的类, 这里Foo是字符串哦  
  12. clazz = getattr(api_module, 'Foo')  
  13. # 实例化  
  14. params = ["milk"]  
  15. instance = clazz(*params)  
  16. # 方法调用, 方法也是字符串methodcaller(方法名, 方法参数)  
  17. task_result = methodcaller("run", "reflection")(instance)  
  18. # running reflection 

5. 总结

本文通过分享了python内置方法和属性, 并在单例模式和反射中进行应用。希望对你有帮助,欢迎交流@mintel 要点总结如下:

 

来源:Python中文社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯