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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python内置类属性_Python内置方法和属性应用:反射和单例(推荐)

發布時間:2024/9/15 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python内置类属性_Python内置方法和属性应用:反射和单例(推荐) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

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

2. 內置方法和函數介紹

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從參數中的多個迭代器取元素組合成一個新的迭代器;

# 給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():一個描述當前執行過程中全局符號表的字典,可以看出你執行的所有過程

id(object):python對象的唯一標識

staticmethod 類靜態函數注解

@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 = 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__': ,

'run': ,

'__dict__': ,

'__weakref__': })

# 類的父類

Foo.__base__

# 類的名字

Foo.__name__

類的實例化和初始化

# python類先通過__new__實例化,再調用__init__進行初始化類成員

foo = Foo('milk')

類的屬性添加和訪問

# 類的訪問

foo.name

foo.run()

# 可以通過setattr 動態的添加屬性

def method():

print("cow")

setattr(foo, "type", "cow")

setattr(foo, "getcow", method)

# cow

foo.type

foo.getcow()

# 動態刪除屬性 delattr

delattr(foo, "type")

# getattr 獲取成員屬性

if hasattr(foo, "run"): # 判斷是否有屬性

func = getattr(foo, "run")

func()

3. 單例模式應用

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

class Singleton(object):

def __new__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

cls._instance = object.__new__(cls)

return cls._instance

def __init__(self, name):

self.name = name

a = Singleton('name1')

b = Singleton('name2')

print(id(a), id(b))

print(a.name, b.name)

# 1689352213112 1689352213112

# name2 name2

4. 反射應用

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

python的實現可以通過上面說的getattr獲取模塊中的類, 通過methodcaller來調用方法。我們來看一個簡單的例子

import importlib

from operator import methodcaller

class Foo():

"""this is test class"""

def __init__(self, name):

self.name = name

def run(self, info):

print('running %s' % info)

# 類所在的模塊,默認情況__main__, 可以通過Foo.__dict__ 中'__module__'獲取

api_module = importlib.import_module('__main__')

# getattr獲取模塊中的類, 這里Foo是字符串哦

clazz = getattr(api_module, 'Foo')

# 實例化

params = ["milk"]

instance = clazz(*params)

# 方法調用, 方法也是字符串methodcaller(方法名, 方法參數)

task_result = methodcaller("run", "reflection")(instance)

# running reflection

5. 總結

本文通過分享了python內置方法和屬性, 并在單例模式和反射中進行應用。希望對你有幫助,歡迎交流@mintel 要點總結如下:

dir下類

查看類自定義屬性__dict__

__new__實例化類,__init__初始化類

getattr 獲取屬性

setattr 設置屬性

記住importlib和methodcaller

到此這篇關于Python內置方法和屬性應用:反射和單例的文章就介紹到這了,更多相關Python內置方法和屬性內容請搜索我們以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持我們!

本文標題: Python內置方法和屬性應用:反射和單例(推薦)

本文地址: http://www.cppcns.com/jiaoben/python/321521.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。