一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中的單例模式與反射機制詳解

Python中的單例模式與反射機制詳解

2022-03-10 00:03zp_cyy Python

這篇文章主要為大家介紹了Python中的單例模式與反射機制,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

單例模式

一般情況下,類可以生成任意個實例,而單例模式只生成一個實例

我們先用單例模式設計一個Rectangle類

然后用__new__方法設計單例模式,代碼如下

?
1
2
3
4
5
6
7
8
class Rectangle:
    def __init__(self,length,width):
        self.length=length
        self.width=width
    def __new__(cls, *args, **kwargs):#__new__至少要有一個參數cls,代表要實例化的類
        if not hasattr(cls,'obj'):  #判斷類當中有沒有實例,如果沒有則新建
            cls.obj=object.__new__(cls#生成實例對象
        return cls.obj

然后我們來驗證下,單例模式下是否只能生成一個實例

?
1
2
3
4
5
6
7
8
9
10
11
12
rec1 = Rectangle(10,8)#判斷類中沒有實例,則新建實例rec1
print(rec1.length,rec1.width)#這時候我們打印下rec1這個長方形的長和寬
>>>10 8#是我們輸入的值
rec2 = Rectangle(6,4)
#Rectangle已經創建過rec1實例了,所以不會再生成新的實例,此時的rec1和rec2指向是同一個對象:Rectangle(6,4)
print(rec1.length,rec1.width)#打印下rec1的長和寬
print(rec2.length,rec2.width)#打印下rec2的長和寬
>>>
6 4
6 4
print(id(rec1)==id(rec2))
>>>Ture #對象/實例只有一個,只是賦給了不同的變量名

單例模式在程序設計中比較典型的應用場景:多個用戶同時調用某個模塊時,會生成一些日志,我們希望這些日志存在同一個文件內,而不是多個文件。

在生成日志模塊我們就可以采用單例模式進行設計。

反射

概念:簡單來說就是可以利用字符串來映射模塊中的相應方法然后可以操作模塊中相應的方法

我們以一個飯店點菜的實際場景來理解Python的反射機制

?
1
2
3
4
5
6
7
class Food_list:#創建一個飯店菜單的類
    def yxrs(self):
        return '魚香肉絲'
    def gbjd(self):
        return '宮保雞丁'
    def hspg(self):
        return '紅燒排骨'

hasatter

hasatter(對象,屬性或方法名)

判斷對象中是否有某個屬性或某個方法,返回值是布爾型

?
1
2
3
4
5
6
7
8
9
10
11
12
guke1 = Food_list()#實例化一個顧客對象
while True:
    diancai = input('請點菜:  ')
    if hasattr(guke1,diancai):#判斷顧客點的菜有沒有
        print('好的,馬上去做')
        break
    else:
        print('這個沒有,換個別的吧')
>>>請點菜:  佛跳墻
>>>這個沒有,換個別的吧
>>>請點菜:  yxrs
>>>好的,馬上去做

getattr

getattr(對象,屬性或方法名,缺省值) 判斷對象中是否有某個屬性或某個方法,如果有返回方法本身,沒有則返回缺省值

?
1
2
3
4
5
6
7
8
9
10
11
guke1 = Food_list()#實例化一個顧客對象
def fun1():#定義一個方法,用作getattr的缺省值
    return '沒有這道菜'
foodname = input('請輸入要翻譯的菜名:')
a = getattr(guke1,foodname,fun1)
#判斷guke1中有沒有foodname方法,有則返回這個方法,沒有則返回fun1方法
print(a())#執行返回的方法
>>>請輸入要翻譯的菜名:yxrs#guke1中有yxrs方法,則返回這個方法
>>>魚香肉絲
>>>請輸入要翻譯的菜名:dsfsfs#guke1中有沒有dsfsfs方法,則返回fun1方法
>>>沒有這道菜

setattr

setattr(對象,屬性,新值)

將實例的屬性改為新的值,如果屬性不存在則新建

我們給實例guke1加個價格屬性

?
1
2
3
4
5
guke1 = Food_list()#實例化一個顧客對象
setattr(guke1,'proce','23元')
print(guke1.proce)
>>>
23

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/zp_cyy/article/details/121599128

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 我不卡影院手机在线观看 | 色综合久久日韩国产 | 欧美一区二区三区四区在线观看 | 亚洲国产网址 | 双性总裁被调教1v1 双性双根 | 四虎1515hhcom | 秋霞黄色 | 国产成人成人一区二区 | 国产精品久久久久久久牛牛 | 好大好猛好爽好深视频免费 | 苍井空50分钟无码 | 第一福利在线视频 | 久久国内精品 | 91搞搞| 美女1819xxxx | 好大好硬抽搐好爽想要 | 成人亚洲欧美综合 | 爱情岛论坛自拍永久入口 | 亚洲理论视频 | 久久中文字幕无线观看 | 干操视频| 欧美侏儒xxx | 黑人chinese女人 | 亚洲经典 | 精品视频二区 | 亚洲日本视频在线观看 | 欧美3p大片在线观看完整版 | 日本精品中文字幕在线播放 | 456成人免费高清视频 | 久久天天躁狠狠躁夜夜躁 | chinese腹肌gay| 国语刺激对白勾搭视频在线观看 | 日产精品卡一卡2卡三卡乱码工厂 | 国产精品免费观在线 | 秋霞理论在一l级毛片 | 热久久天天拍天天拍热久久2018 | ak福利影院 | 日本一区二区视频免费播放 | 6080窝窝理论 | 亚洲阿v天堂在线2017 | 欧美另类性xxoo |