成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

2020-02-05 21:46:58

工業物聯網IIOT物聯網

2023-09-21 22:19:03

Python編程語言

2023-03-21 15:21:52

開發程序設計static

2010-07-06 16:38:47

UML用例建模

2021-06-29 11:09:59

區塊鏈區塊鏈技術比特幣

2023-11-20 14:41:34

Python屬性

2019-07-03 09:46:31

物聯網傳感器機器學習

2016-03-24 11:26:21

runtime成員變量屬性

2023-10-11 13:13:46

?PostmanJavaScrip

2024-11-06 16:13:00

Python單例模式

2009-08-18 13:41:40

WebBrowser控

2009-09-17 16:45:56

C#數組

2010-07-08 16:34:01

UML包圖

2010-06-29 16:43:54

UML用例建模

2010-06-17 12:32:54

UML用例建模

2010-08-31 15:24:43

CSSpositionabsolute

2010-09-28 10:33:59

HTML DOM Ch

2009-10-10 16:40:37

VB.NET Cont
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 不卡视频一区 | 欧美成人二区 | 欧美福利视频一区 | www.av在线 | 国产精品a久久久久 | 午夜看电影在线观看 | 9porny九色视频自拍 | 国产高清av免费观看 | 婷婷成人在线 | www.蜜桃av| 中国av在线免费观看 | 高清亚洲 | 中文字幕免费 | 在线观看 亚洲 | 亚洲国产精品人人爽夜夜爽 | 91资源在线 | 亚洲色图在线观看 | 成年人在线视频 | 一级片在线视频 | 91大神在线资源观看无广告 | 老外几下就让我高潮了 | 精久久久 | 日韩电影免费观看中文字幕 | 成人妇女免费播放久久久 | 天天色天天射天天干 | 男女免费视频网站 | 欧美日韩三级在线观看 | 国精日本亚洲欧州国产中文久久 | 中文字幕高清av | 免费观看黄网站 | 在线亚洲一区二区 | 久久99精品久久久 | 久久网站黄 | 国产美女在线观看 | 99久久婷婷国产综合精品 | 欧美日韩在线一区 | 欧美九九九| 在线色网 | 男人天堂av网站 | 免费一区二区三区在线视频 | 欧美亚洲国产一区 |