日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2025/3/19 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 内置方法和属性应用:反射和单例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 前言

python除了豐富的第三方庫外,本身也提供了一些內(nèi)在的方法和底層的一些屬性,大家比較常用的如dict、list、set、min、max、range、sorted等。筆者最近在做項(xiàng)目框架時涉及到一些不是很常用的方法和屬性,在本文中和大家做下分享。

2. 內(nèi)置方法和函數(shù)介紹

  • enumerate

    如果你需要遍歷可迭代的對象,有需要獲取它的序號,可以用enumerate, 每一個next返回的是一個tuple

    list1?=?[1,?2,?3,?4] list2?=?[4,?3,?2,?1] for?idx,?value?in?enumerate(list1):print(idx,?value,?list2[idx]) #?0?1?4 #?1?2?3 #?2?3?2 #?3?4?1
  • zip zip從參數(shù)中的多個迭代器取元素組合成一個新的迭代器;

    #?給list加上序號 b?=?[4,?3,?2,?1] for?i?in?zip(range(len(b)),?b):print(i) #?(0,?4) #?(1,?3) #?(2,?2) #?(3,?1)
  • globals():一個描述當(dāng)前執(zhí)行過程中全局符號表的字典,可以看出你執(zhí)行的所有過程

  • id(object):python對象的唯一標(biāo)識

  • staticmethod 類靜態(tài)函數(shù)注解

    @staticmethod?? def?test():?print('this?is?static?method')Foo.test?=?test Foo.test()
  • 類的屬性 我們來看下一個類的申明,如下:

    class?Foo():"""this?is?test?class"""def?__init__(self,?name):self.name?=?namedef?run(self):print('running') #?列出類的所有成員和屬性 dir(Foo) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'run']#?類的注釋 Foo.__doc__ #?'this?is?test?class'#?類自定義屬性 Foo.__dict__ mappingproxy({'__module__':?'__main__','__doc__':?'this?is?test?class','__init__':?<function?__main__.Foo.__init__(self,?name)>,'run':?<function?__main__.Foo.run(self)>,'__dict__':?<attribute?'__dict__'?of?'Foo'?objects>,'__weakref__':?<attribute?'__weakref__'?of?'Foo'?objects>})#?類的父類 Foo.__base__#?類的名字 Foo.__name__

    類的實(shí)例化和初始化

    #?python類先通過__new__實(shí)例化,再調(diào)用__init__進(jìn)行初始化類成員 foo?=?Foo('milk')

    類的屬性添加和訪問

    #?類的訪問 foo.name foo.run()#?可以通過setattr?動態(tài)的添加屬性 def?method():print("cow")setattr(foo,?"type",?"cow") setattr(foo,?"getcow",?method) #?cow foo.type foo.getcow()#?動態(tài)刪除屬性?delattr delattr(foo,?"type")#?getattr?獲取成員屬性 if?hasattr(foo,?"run"):?#?判斷是否有屬性func?=?getattr(foo,?"run")func()

3. 單例模式應(yīng)用

單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計模式之一。單例模式要求在類的使用過程中只實(shí)例化一次,所有對象都共享一個實(shí)例。創(chuàng)建的方法是在實(shí)例的時候判斷下是否已經(jīng)實(shí)例過了,有則返回實(shí)例化過的全局實(shí)例。python是如何實(shí)現(xiàn)的呢?關(guān)鍵是找到實(shí)例化的地方,對就是前面說的__new__

class?Singleton(object):def?__new__(cls,?*args,?**kwargs):if?not?hasattr(cls,?'_instance'):cls._instance?=?object.__new__(cls)return?cls._instancedef?__init__(self,?name):self.name?=?namea?=?Singleton('name1') b?=?Singleton('name2') print(id(a),?id(b)) print(a.name,?b.name) #?1689352213112?1689352213112 #?name2?name2

4. 反射應(yīng)用

反射在許多框架中都有使用到,簡單就是通過類的名稱(字符串)來實(shí)例化類。一個典型的場景就是通過配置的方式來動態(tài)控制類的執(zhí)行,比如定時任務(wù)的執(zhí)行,通過維護(hù)每個定時任務(wù)類的執(zhí)行時間,在執(zhí)行時間到的時候,通過反射方式實(shí)例化類,執(zhí)行任務(wù),在java中也非常的常見。

python的實(shí)現(xiàn)可以通過上面說的getattr獲取模塊中的類, 通過methodcaller來調(diào)用方法。我們來看一個簡單的例子

import?importlib from?operator?import?methodcallerclass?Foo():"""this?is?test?class"""def?__init__(self,?name):self.name?=?namedef?run(self,?info):print('running?%s'?%?info)#?類所在的模塊,默認(rèn)情況__main__,?可以通過Foo.__dict__?中'__module__'獲取 api_module?=?importlib.import_module('__main__')? #?getattr獲取模塊中的類,?這里Foo是字符串哦 clazz?=?getattr(api_module,?'Foo')#?實(shí)例化 params?=?["milk"] instance?=?clazz(*params)#?方法調(diào)用,?方法也是字符串methodcaller(方法名,?方法參數(shù)) task_result?=?methodcaller("run",?"reflection")(instance)#?running?reflection

5. 總結(jié)

本文通過分享了python內(nèi)置方法和屬性, 并在單例模式和反射中進(jìn)行應(yīng)用。希望對你有幫助,歡迎交流@mintel 要點(diǎn)總結(jié)如下:

  • dir下類

  • 查看類自定義屬性__dict__

  • __new__實(shí)例化類,__init__初始化類

  • getattr 獲取屬性

  • setattr 設(shè)置屬性

  • 記住importlib和methodcaller

總結(jié)

以上是生活随笔為你收集整理的Python 内置方法和属性应用:反射和单例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。