1. 程式人生 > >Python基礎——類new方法與單例模式

Python基礎——類new方法與單例模式

介紹:

    new方法是類中魔術方法之一,他的作用是給類例項化開闢一個記憶體地址,並返回一個例項化,再由__init__對這個例項進行初始化,故它的執行肯定就是在初始化方法__init__之前了。new方法的第一個引數cls是類本身的含義(即你要例項化的類),與self不同,self是例項化本身,兩者還是有很大的區別的。

    在定義新式類時沒有重新定義new()時 ,Python預設是呼叫該類的直接父類的new()方法來構造該類的例項,如果該類的父類也沒有重寫 new(),那麼將一直按此規矩追溯至object的new()方法,因為object是所有新式類的基類。 如果自己重寫new方法,記住千萬不能返回呼叫自身的new方法,因為這樣會造成死迴圈。

單利化模式

   單利化模式的意思是一個類只能被例項化一次,即使例項化多次,利用id()函式可以發現他們的id都是一樣的,即記憶體地址相同,後者例項的會將前面例項化的物件給覆蓋掉,這個模式的好處是可以節省記憶體。程式碼如下:

class Rectangle:
    def __new__(cls,*args,**kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)#super()方法是呼叫其父類,即object

            return cls._instance
        else:

            return cls._instance
    def __init__(self,Length,Width):
        self.Length = Length
        self.Width = Width
        print (self.Width)
    def A(self):
        print (self.Length)

a = Rectangle(4,6)
b = Rectangle(5,7)
print (a,b)
6
7
<__main__.Rectangle object at 0x00000145F8E22390> <__main__.Rectangle object at 0x00000145F8E22390>

上述程式碼可以發現,在第一次例項化時,我們會用一個私有屬性_instance去接收父類new方法開闢的記憶體,並返回。當我們第二次例項化時,由於私有屬性_instance存在,故直接返回它。可以發現的是,兩次例項化中,new方法所返回的記憶體空間是同一個,故最後得到的例項化當然就是一樣的記憶體地址了,b的初始化帶來的屬性會覆蓋掉a的屬性。

相關推薦

Python基礎——new方法模式

介紹:     new方法是類中魔術方法之一,他的作用是給類例項化開闢一個記憶體地址,並返回一個例項化,再由__init__對這個例項進行初始化,故它的執行肯定就是在初始化方法__init__之前了。new方法的第一個引數cls是類本身的含義(即你要例項化的類),與self

ruby中的方法

類方法 類方法:方法的接受者就是類本身的方法稱為類方法。 直白一點來說,類方法不需要例項化得到物件去呼叫,可以直接通過類名.方法名去呼叫一個方法。 類方法有三種定義形式 第一種:class <&

Android開發筆記之工具使用靜態方法物件方法的優劣

最近在做專案開發的時候用到了很多工具類,之前對工具類的理解僅限於使用靜態方法,沒有細究.寫了很多有損app執行效能的程式碼.例如在靜態方法內建立了例項物件,這樣讓靜態方法持有物件,使得物件一直存在與記憶體中,無法被GC回收,佔用記憶體,影響效能和使用者體驗

scala 基礎十二 scala apply的使用,工廠方法模式的實現

定義 其他 返回 pack 新的 true 伴生對象 args null 1. apply 可以用來實現類似於靜態的初始化類的實例,請看下面實例 package smart.iot class applyclass { } class A {

,__call__方法模式

rom pan AR erro metaclass self acl clas HA 在python中一切皆對象的概念。 舉一個例子: class Chinese: country=“china” def __init__(self, name,age,s

Java | 基礎歸納 | 靜態方法方法的區別

的區別 方法 方法名 則無 blog arch 靜態成員 java 類名 靜態方法和實例方法的區別主要體現在兩個方面: 在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有後面這種方式。也就是說,調用靜態方法可以無需創建對

python中的__new__方法設計模式

#1. __new__方法 # 建立物件(__new__) =》 初始化物件(__init__) class Car(object): #__new__方法是類方法 def __new__(cls,*args,**kwargs): print('

python幾個面試題目:模式,淺拷貝深拷貝

主要參考git上一篇面試題目,連結如下https://github.com/taizilongxu/interview_python#2-python%E4%B8%AD%E7%9A%84%E5%85%83%E7%B1%BBmetaclass 實現單例模式,對每種方式新增更詳

python一種用classmethod實現模式方法的探討

初步實現程式碼如下: class Singleton(object): instance = None def __init__(self): pass @classmethod def get_instance(cls):

python之路_flask框架_模式及session原理

sql content pytho his pri 我們 main imp dbutil 實例化補充: 一、單例模式 1、單例模式介紹   單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整

python 實現執行緒安全的模式

單例模式是一種常見的設計模式,該模式的主要目的是確保某一個類只有一個例項存在。當你希望在整個系統中,某個類只能出現一個例項時,單例物件就能派上用場。 比如,伺服器的配置資訊寫在一個檔案中online.conf中,客戶端通過一個 Config 的類來讀取配置檔案的內容。如果在

Java中基於靜態變數模式對快取的簡單實現

●What & Why 快取是什麼?他有什麼好處?相信不用說大家都知道。 目前筆者在做一個Java開發的Web專案,專案啟動的時候需要將大量不變的平臺數據放入快取中,方便快速讀取。一開始筆者很疑惑,Java是不能直接操作記憶體的,但是我們快取卻是要把資料放入記憶體

java基礎總結(二十七)-- 模式的建立方式之一雙檢索,有什麼缺陷嗎?

來自:https://blog.csdn.net/a_842297171/article/details/79316591   這幾天看併發程式設計的書,發現原先寫的單例模式有點問題,當時認為雙重檢查是安全的,現在有新的瞭解。下面是雙重檢查寫法: public static L

設計模式的分類 模式

設計模式GOF23(Group of four 四人幫) 一、設計模式是面向物件思想中重要的一點。 二、模式分為分為三種: 1.建立型模式:幫助我們建立物件 (1)單例模式 (2)工廠模式 (3)抽象工廠模式 (4)建造者模式 (5)原型模式 2.結構型模式:

關鍵字static模式的一點理解

static是java語言中的一個關鍵字,表示一個靜態修飾符,修飾符比較容易理解,靜態修飾符又有什麼特點呢,首先程式中的任何變數或者程式碼都是在編譯時,由系統自動分配記憶體來儲存的,而靜態的特點就是指,在編譯後所分配的記憶體會一直存在,直到程式退出是才會釋放這個

對工廠模式模式的理解

正式學java也那麼久了,今天就來梳理一下java的工廠模式(據說這是java23例模式中最簡單的一種模式) 所謂的工廠模式大概就是通過一個介面實現對子類的呼叫,當初我接觸工廠模式的時候,還沒意識到原來這就是工廠模式, 當時老師是據了一個抽獎系統的例子,大概是這樣,先寫一個

享元模式模式區別

單例模式是類級別的,一個類只能有一個物件例項; 享元模式是物件級別的,可以有多個物件例項,多個變數引用同一個物件例項; 享元模式主要是為了節約記憶體空間,提高系統性能,而單例模式主要為了可以共享資料;

php面向物件(工廠模式模式

今天剛學習了php的設計模式,一個是工廠模式而另一個是單例模式,工廠模式設計出來就是為了一種方便建立物件而做出來的。還有一個是單例模式,單例模式的設計有些比較難以理解,我們必須一步一步的分析:單例類的情況必須去建立類的例項,而且必須只有一個,首先沒有物件例項的情況就是將它的

[Unity]建構函式模式

從BUG說起 在實現一個小功能時,遇到了一個bug,程式碼如下: public class EnemySpawner : MonoBehaviour { #region singleton private EnemySpawner()

同步原語 volatile 簡介模式

Volatile 簡介 volatile 的作用 在多執行緒併發程式設計中 synchronized 和 volatile 都扮演著重要的角色,volatile 是輕量級的 synchronized,它在多處理器開發中保證了共享變數的“可見性”。共享變數