0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python-類、單例模式

汽車電子技術(shù) ? 來源:程序猿知秋 ? 作者: 程序猿知秋 ? 2023-02-16 15:38 ? 次閱讀

基礎(chǔ)術(shù)語

  • 使用 類名() 創(chuàng)建對(duì)象,**創(chuàng)建對(duì)象 **的動(dòng)作有兩步
    • 在內(nèi)存中為對(duì)象 分配空間
    • 調(diào)用初始化方法 init 為對(duì)象初始化
  • 對(duì)象創(chuàng)建后,內(nèi)存中就有了一個(gè)對(duì)象的** 實(shí)例**
  • 通常會(huì)把
    • 創(chuàng)建出來的 對(duì)象 叫做 的實(shí)例
    • 創(chuàng)建對(duì)象的 **動(dòng)作 **叫做 實(shí)例化
    • 對(duì)象的屬性 叫做** 實(shí)例屬性**
  • 在程序執(zhí)行時(shí)
    • 對(duì)象各自擁有自己的 實(shí)例屬性
    • 調(diào)用對(duì)象方法,可以通過 self. 訪問自己的屬性或方法
  • 每一個(gè)對(duì)象 都有一個(gè)自己獨(dú)立的內(nèi)存空間,互不干涉
  • 多個(gè)對(duì)象的方法, 在內(nèi)存中只有一份 ,在調(diào)用方法時(shí),需要把對(duì)象的引用傳遞到方法內(nèi)部

類是一個(gè)特殊的對(duì)象

  • Python 中 一切皆對(duì)象
  • 類是一個(gè)特殊的對(duì)象,同樣會(huì)被加載到內(nèi)存中,類對(duì)象在內(nèi)存中只有一份
  • 一個(gè)類可以創(chuàng)建出多個(gè)對(duì)象實(shí)例
  • 除了封裝** 實(shí)例 屬性和方法**外,類對(duì)象還可以擁有自己的屬性和方法
  • 通過** 類名.** 的方式可以訪問類的屬性和方法

示例

class Animal:
  # 定義一個(gè) 類 屬性
  count=0


  def __init__(self,name):
    self.name=name


    Animal.count=Animal.count+1


animal1=Animal("小白")
animal2=Animal("小黑")
animal3=Animal("小綠")


print("查看類屬性的變化次數(shù):%d" %Animal.count)

輸出結(jié)果

圖片

類方法

  • **類方法 就是針對(duì) 類對(duì)象 **定義的方法
    • 類方法 內(nèi)部可以直接訪問 類屬性 或者調(diào)用其他的 類方法
  • 類方法需要用** 修飾器 @classmethod **來標(biāo)識(shí),告訴解釋器這是一個(gè) 類方法
  • 類方法的 第一個(gè)參數(shù) 應(yīng)該是 cls
    • 哪一個(gè)類調(diào)用的方法 ,方法內(nèi)的 cls ,就是哪一個(gè)類的引用
    • 這個(gè)參數(shù)和 實(shí)例方法的第一個(gè)參數(shù) self 類似
    • 不使用 cls ,使用其他名稱也可以,習(xí)慣問題
  • 通過 **類名. **調(diào)用類方法,不需要傳遞 cls 參數(shù)
  • 在方法內(nèi)部,可以通過** cls.** 訪問類的屬性或類的方法

**語法

**

@classmethod
def 類方法名(cls):
    pass

示例

class Animal:
  # 定義一個(gè) 類 屬性
  count=0


  def __init__(self,name):
    self.name=name
    Animal.count=Animal.count+1


  # 定義一個(gè) 類 方法
  @classmethod
  def show_count(cls):
    print("我是類方法,類屬性的值是:%d"%cls.count)


Animal("小白")
Animal("小黑")
# 調(diào)用類 方法
Animal.show_count()

輸出結(jié)果

圖片

靜態(tài)方法

  • 使用修飾器 @staticmethod 來標(biāo)識(shí)
  • 通過 **類名. **調(diào)用 靜態(tài)方法
  • 使用場(chǎng)景
    • 不需要訪問** 實(shí)例屬性** 或者調(diào)用** 實(shí)例方法**
    • 不需要訪問** 類屬性** 或者調(diào)用 類方法

語法

@staticmethod
def 靜態(tài)方法名():
    pass

示例

class Person:
  # 定義類屬性
  count=0


  def __init__(self,name):
    self.name=name




  # 定義一個(gè)靜態(tài)方法,靜態(tài)方法不能調(diào)用 類方法或?qū)傩?與 實(shí)例方法或?qū)傩?/span>
  @staticmethod
  def static_test():
    print("我是一個(gè)靜態(tài)方法,不能調(diào)用類方法與屬性 和實(shí)例方法與屬性")


# 靜態(tài)方法直接用 類名調(diào)用
Person.static_test()

輸出結(jié)果

圖片

綜合練習(xí)示例

"""
需求:窗口取票
票數(shù)是共有的
每個(gè)人取的數(shù)量不一樣


操作提示信息,不與任何屬性或方法關(guān)聯(lián)
"""
class Ticket:
  # 總共 10 張票
  totalTicket=10


  def __init__(self,name):
    self.name=name



  # 操作說明,可以使用靜態(tài)方法實(shí)現(xiàn)
  @staticmethod
  def show_instructions():
    print("操作說明:取票的數(shù)量不能超過票總數(shù)量!!!")


  # 顯示總票數(shù),可以使用 類方法
  @classmethod
  def show_ticket(cls):
    print("還剩余的票數(shù)有:%s 張" %cls.totalTicket)


  # 取票,可以使用實(shí)例方法
  def take_ticket(self,num):
    Ticket.totalTicket=Ticket.totalTicket-num
    print("%s 取走了 %d 張票..."%(self.name,num))




# 取票的操作說明 
Ticket.show_instructions()


# 開始取票,張三 取3張, 李四取4張
zs=Ticket("張三")
zs.take_ticket(3)
#查看剩余票數(shù)
Ticket.show_ticket()




ls=Ticket("李四")
ls.take_ticket(4)
#查看剩余票數(shù)
Ticket.show_ticket()

輸出結(jié)果

圖片

單例模式

設(shè)計(jì)模式

  • **設(shè)計(jì)模式 **是針對(duì)某一特定問題的解決方案,由人們總結(jié)和提煉的
  • 使用設(shè)計(jì)模式 是為了可重用代碼, 使代碼更容易理解,保證代碼可靠性
  • 單例設(shè)計(jì)模式
    • 目的: 讓類創(chuàng)建的對(duì)象,在系統(tǒng)中只有 唯一一個(gè)
    • 每一次執(zhí)行 **類名() **返回的內(nèi)存地址引用,都是同一個(gè)

**__new__方法

**

  • 使用 類名() 創(chuàng)建對(duì)象時(shí), Python的解釋器首先會(huì)調(diào)用** new **方法為對(duì)象 分配內(nèi)存空間
  • Python的解釋器獲得對(duì)象的引用后,將引用作為第一個(gè)參數(shù),傳遞給 **init **方法
  • 重寫 new 方法的代碼非常固定
  • 重寫 new 方法一定要 return super(). new (cls)
  • 否則 Python的解釋器 得不到對(duì)象引用,就不會(huì)調(diào)用初始化方法
  • **new **是一個(gè) 靜態(tài)方法 ,在調(diào)用時(shí)需要 主動(dòng)傳遞 cls 參數(shù)

示例

class SingleClass():


  # 定義類實(shí)例對(duì)象
  instants=None


  # 重寫 __new__ 方法
  def __new__(cls,*agrs,**kwargs):
    print("創(chuàng)建對(duì)象方法.....")

    if SingleClass.instants== None:
      # 初始化實(shí)例對(duì)象,調(diào)用父類方法
      SingleClass.instants=super().__new__(cls)
    return SingleClass.instants

  def __init__(self):
    print("初始化方法。。。。")


# 單例模式 ,不管創(chuàng)建多少次實(shí)例,實(shí)際上都是同一個(gè)
s1=SingleClass()
s2=SingleClass()
s3=SingleClass()
print(s1)
print(s2)
print(s3)

輸出結(jié)果

圖片

以上的方法雖然解決了對(duì)象只會(huì)創(chuàng)建一次的問題,但是初始化的方法還會(huì)調(diào)用多次,消耗內(nèi)存。 此處可以 增加一個(gè) initFlag 的標(biāo)記,一但初始化后就打上標(biāo)記,以后就不再進(jìn)行初始化。 改造代碼如下:

class SingleClass():


  # 定義類實(shí)例對(duì)象
  instants=None


  # 定義一個(gè)初始化標(biāo)記
  initFlag=False


  # 重寫 __new__ 方法
  def __new__(cls,*agrs,**kwargs):    
    if SingleClass.instants== None:
      print("創(chuàng)建對(duì)象方法.....")
      # 初始化實(shí)例對(duì)象,調(diào)用父類方法
      SingleClass.instants=super().__new__(cls)
    return SingleClass.instants

  def __init__(self):


    if SingleClass.initFlag:
      return


    print("初始化方法。。。。")
    SingleClass.initFlag=True




# 單例模式 ,不管創(chuàng)建多少次實(shí)例,實(shí)際上都是同一個(gè)
s1=SingleClass()
s2=SingleClass()
s3=SingleClass()
print(s1)
print(s2)
print(s3)

**輸出結(jié)果

**

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73538
  • 對(duì)象
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    17340
  • 空間
    +關(guān)注

    關(guān)注

    2

    文章

    48

    瀏覽量

    13578
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    2018年Python面試必看的10個(gè)面試題

    )lambda函數(shù)默認(rèn)返回表達(dá)式的值。你也可以將其賦值給一個(gè)變量。lambda函數(shù)可以接受任意個(gè)參數(shù),包括可選參數(shù),但是表達(dá)式只有一個(gè)。5.python如何實(shí)現(xiàn)模式?答:
    發(fā)表于 07-18 14:52

    請(qǐng)問python-樹莓派如何通過按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn)?

    步進(jìn)電機(jī)驅(qū)動(dòng)原理是什么?python-樹莓派如何通過按鍵控制步進(jìn)電機(jī)正反轉(zhuǎn)?
    發(fā)表于 10-09 08:45

    python的繼承

    python的繼承的繼承,跟人類繁衍的關(guān)系相似。被繼承的稱為基(也叫做父),繼承而得的
    發(fā)表于 03-08 16:40

    python-控制khr3hv-master機(jī)器人

    python-控制khr3hv機(jī)器人,感興趣的小伙伴們可以瞧一瞧。
    發(fā)表于 11-22 15:40 ?2次下載

    關(guān)于iOS開發(fā)單使用問題

    ,NSFileManager等等。雖然它們用起來十分方便,但實(shí)際上它們有許多問題需要注意。所以在你下次自動(dòng)補(bǔ)全dispatch_once代碼片段的時(shí)候,想一下這樣會(huì)導(dǎo)致什么后果。 什么是 在《設(shè)計(jì)模式》一書中給出了
    發(fā)表于 09-25 16:25 ?0次下載

    模式詳解

    是private的話,會(huì)不更好的封裝該內(nèi)呢?我主要是應(yīng)用在使用普通模擬枚舉類型里,后來發(fā)現(xiàn)這就是傳說中的模式。構(gòu)造函數(shù)弄成private 就是
    發(fā)表于 09-27 15:10 ?0次下載

    模式分成餓漢模式和懶漢模式解析

    定義:作為對(duì)象的創(chuàng)建模式模式確保某一個(gè)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)
    發(fā)表于 12-11 09:49 ?1614次閱讀

    python-速成指南

    python 提供好用的兩個(gè)容器:list 和 dict。插句題外話,其實(shí)最好用的容器還是 PHP 提供的關(guān)聯(lián)數(shù)組,一個(gè)數(shù)組就包括了 python 中 list 和 dict 的全部功能,實(shí)在是很贊。
    發(fā)表于 03-28 16:32 ?9次下載

    python的繼承詳解

    python的繼承 的繼承,跟人類繁衍的關(guān)系相似。 被繼承的稱為基(也叫做父),繼承而
    的頭像 發(fā)表于 03-08 16:40 ?3009次閱讀

    Python-字典

    dictionary (字典) **是除列表外** Python **中,最靈活的數(shù)據(jù)類型
    的頭像 發(fā)表于 02-16 15:02 ?550次閱讀
    <b class='flag-5'>Python-</b>字典

    Python的屬性和方法是什么

    編程中我們用來創(chuàng)建對(duì)象。日常生活中的汽車設(shè)計(jì)圖就是我們Python中的。日常生活中的小汽車就是Python中的對(duì)象。
    的頭像 發(fā)表于 02-23 10:17 ?776次閱讀

    什么是python與對(duì)象

    Python中的,type函數(shù)查看數(shù)據(jù)類型
    的頭像 發(fā)表于 02-23 10:18 ?659次閱讀

    Python實(shí)現(xiàn)模式的五種寫法

    模式(Singleton Pattern) 是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)
    的頭像 發(fā)表于 05-24 11:27 ?416次閱讀

    模式(Singleton Pattern)實(shí)現(xiàn)的方法

    模式是指某個(gè)只允許存在一個(gè)實(shí)例對(duì)象,例如在打印機(jī)打印文件時(shí),一次只允許打印一個(gè)文件
    的頭像 發(fā)表于 06-01 11:44 ?547次閱讀
    <b class='flag-5'>單</b><b class='flag-5'>例</b><b class='flag-5'>模式</b>(Singleton Pattern)實(shí)現(xiàn)的方法

    Python中元的作用

    1.什么是 在理解元之前,我們必須先掌握Python中的(class)。 和大多數(shù)語言一樣,Python中的
    的頭像 發(fā)表于 11-02 11:18 ?387次閱讀
    <b class='flag-5'>Python</b>中元<b class='flag-5'>類</b>的作用