日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

1. 前言

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

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

  • enumerate
    如果你需要遍歷可迭代的對(duì)象,有需要獲取它的序號(hào),可以用enumerate, 每一個(gè)next返回的是一個(gè)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ù)中的多個(gè)迭代器取元素組合成一個(gè)新的迭代器;# 給list加上序號(hào)
    b = [4, 3, 2, 1]
    for i in zip(range(len(b)), b):
    print(i)# (0, 4)# (1, 3)# (2, 2)# (3, 1)
  • globals():一個(gè)描述當(dāng)前執(zhí)行過程中全局符號(hào)表的字典,可以看出你執(zhí)行的所有過程
  • id(object):python對(duì)象的唯一標(biāo)識(shí)
  • staticmethod 類靜態(tài)函數(shù)注解
    @staticmethod
    def test():
    print('this is static method')
    Foo.test = test
    Foo.test()
  • 類的屬性 我們來看下一個(gè)類的申明,如下:
    class Foo():
    """this is test class"""
    def __init__(self, name):
    self.name = name
    def 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 動(dòng)態(tài)的添加屬性
    def method():
    print("cow")
    setattr(foo, "type", "cow")
    setattr(foo, "getcow", method)# cow
    foo.type
    foo.getcow()# 動(dòng)態(tài)刪除屬性 delattr
    delattr(foo, "type")# getattr 獲取成員屬性
    if hasattr(foo, "run"): # 判斷是否有屬性
    func = getattr(foo, "run")
    func()

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

單例模式(Singleton Pattern)是 Java 中最簡單的設(shè)計(jì)模式之一。單例模式要求在類的使用過程中只實(shí)例化一次,所有對(duì)象都共享一個(gè)實(shí)例。創(chuàng)建的方法是在實(shí)例的時(shí)候判斷下是否已經(jīng)實(shí)例過了,有則返回實(shí)例化過的全局實(shí)例。python是如何實(shí)現(xiàn)的呢?關(guān)鍵是找到實(shí)例化的地方,對(duì)就是前面說的__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í)例化類。一個(gè)典型的場(chǎng)景就是通過配置的方式來動(dòng)態(tài)控制類的執(zhí)行,比如定時(shí)任務(wù)的執(zhí)行,通過維護(hù)每個(gè)定時(shí)任務(wù)類的執(zhí)行時(shí)間,在執(zhí)行時(shí)間到的時(shí)候,通過反射方式實(shí)例化類,執(zhí)行任務(wù),在java中也非常的常見。

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

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)用。希望對(duì)你有幫助,歡迎交流@mintel 要點(diǎn)總結(jié)如下:

  • dir下類
  • 查看類自定義屬性__dict__
  • __new__實(shí)例化類,__init__初始化類
  • getattr 獲取屬性
  • setattr 設(shè)置屬性
  • 記住importlib和methodcaller

小編在此分享一些python干貨,需要資料的私信小編“資料”即可免費(fèi)領(lǐng)取哈

總結(jié)

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

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