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

开发 后端
笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享。

[[330687]]

1. 前言

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

2. 内置方法和函数介绍

  •  enumerate

    如果你需要遍历可迭代的对象,有需要获取它的序号,可以用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 
  •  zip zip从参数中的多个迭代器取元素组合成一个新的迭代器; 
  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) 
  •  globals():一个描述当前执行过程中全局符号表的字典,可以看出你执行的所有过程
  •  id(object):python对象的唯一标识
  •  staticmethod 类静态函数注解   
  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 要点总结如下:

  •  dir下类
  •  查看类自定义属性__dict__
  •  __new__实例化类,__init__初始化类
  •  getattr 获取属性
  •  setattr 设置属性
  •  记住importlib和methodcaller 

 

责任编辑:庞桂玉 来源: Python中文社区
相关推荐

2020-09-16 12:18:28

GoJava模式

2024-03-18 08:33:16

2023-09-21 22:19:03

Python编程语言

2020-02-05 21:46:58

工业物联网IIOT物联网

2023-03-21 15:21:52

开发程序设计static

2023-11-20 14:41:34

Python属性

2024-11-06 16:13:00

Python单例模式

2019-07-03 09:46:31

物联网传感器机器学习

2023-10-11 13:13:46

​PostmanJavaScrip

2021-06-29 11:09:59

区块链区块链技术比特币

2010-07-06 16:38:47

UML用例建模

2016-03-24 11:26:21

runtime成员变量属性

2009-08-18 13:41:40

WebBrowser控

2009-09-17 16:45:56

C#数组

2010-06-17 12:32:54

UML用例建模

2010-06-29 16:43:54

UML用例建模

2010-07-08 16:34:01

UML包图

2010-08-31 15:24:43

CSSpositionabsolute

2011-08-29 10:35:53

反射方式C#

2010-09-28 10:33:59

HTML DOM Ch
点赞
收藏

51CTO技术栈公众号