類
基礎術語
- 使用 類名() 創建對象,**創建對象 **的動作有兩步
- 在內存中為對象 分配空間
- 調用初始化方法 init 為對象初始化
- 對象創建后,內存中就有了一個對象的** 實例**
- 通常會把
- 創建出來的 對象 叫做 類 的實例
- 創建對象的 **動作 **叫做 實例化
- 對象的屬性 叫做** 實例屬性**
- 在程序執行時
- 對象各自擁有自己的 實例屬性
- 調用對象方法,可以通過 self. 訪問自己的屬性或方法
- 每一個對象 都有一個自己獨立的內存空間,互不干涉
- 多個對象的方法, 在內存中只有一份 ,在調用方法時,需要把對象的引用傳遞到方法內部
類是一個特殊的對象
- Python 中 一切皆對象
- 類是一個特殊的對象,同樣會被加載到內存中,類對象在內存中只有一份
- 一個類可以創建出多個對象實例
- 除了封裝** 實例 的屬性和方法**外,類對象還可以擁有自己的屬性和方法
- 通過** 類名.** 的方式可以訪問類的屬性和方法
示例
class Animal:
# 定義一個 類 屬性
count=0
def __init__(self,name):
self.name=name
Animal.count=Animal.count+1
animal1=Animal("小白")
animal2=Animal("小黑")
animal3=Animal("小綠")
print("查看類屬性的變化次數:%d" %Animal.count)
輸出結果
類方法
- **類方法 就是針對 類對象 **定義的方法
- 在類方法 內部可以直接訪問 類屬性 或者調用其他的 類方法
- 類方法需要用** 修飾器 @classmethod **來標識,告訴解釋器這是一個 類方法
- 類方法的 第一個參數 應該是 cls
- 由 哪一個類調用的方法 ,方法內的 cls ,就是哪一個類的引用
- 這個參數和 實例方法的第一個參數 self 類似
- 不使用 cls ,使用其他名稱也可以,習慣問題
- 通過 **類名. **調用類方法,不需要傳遞 cls 參數
- 在方法內部,可以通過** cls.** 訪問類的屬性或類的方法
**語法
**
@classmethod
def 類方法名(cls):
pass
示例
class Animal:
# 定義一個 類 屬性
count=0
def __init__(self,name):
self.name=name
Animal.count=Animal.count+1
# 定義一個 類 方法
@classmethod
def show_count(cls):
print("我是類方法,類屬性的值是:%d"%cls.count)
Animal("小白")
Animal("小黑")
# 調用類 方法
Animal.show_count()
輸出結果
靜態方法
- 使用修飾器 @staticmethod 來標識
- 通過 **類名. **調用 靜態方法
- 使用場景
- 不需要訪問** 實例屬性** 或者調用** 實例方法**
- 不需要訪問** 類屬性** 或者調用 類方法
語法
@staticmethod
def 靜態方法名():
pass
示例
class Person:
# 定義類屬性
count=0
def __init__(self,name):
self.name=name
# 定義一個靜態方法,靜態方法不能調用 類方法或屬性 與 實例方法或屬性
@staticmethod
def static_test():
print("我是一個靜態方法,不能調用類方法與屬性 和實例方法與屬性")
# 靜態方法直接用 類名調用
Person.static_test()
輸出結果
綜合練習示例
"""
需求:窗口取票
票數是共有的
每個人取的數量不一樣
操作提示信息,不與任何屬性或方法關聯
"""
class Ticket:
# 總共 10 張票
totalTicket=10
def __init__(self,name):
self.name=name
# 操作說明,可以使用靜態方法實現
@staticmethod
def show_instructions():
print("操作說明:取票的數量不能超過票總數量!!!")
# 顯示總票數,可以使用 類方法
@classmethod
def show_ticket(cls):
print("還剩余的票數有:%s 張" %cls.totalTicket)
# 取票,可以使用實例方法
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)
#查看剩余票數
Ticket.show_ticket()
ls=Ticket("李四")
ls.take_ticket(4)
#查看剩余票數
Ticket.show_ticket()
輸出結果
單例模式
設計模式
- **設計模式 **是針對某一特定問題的解決方案,由人們總結和提煉的
- 使用設計模式 是為了可重用代碼, 使代碼更容易理解,保證代碼可靠性
- 單例設計模式
- 目的: 讓類創建的對象,在系統中只有 唯一一個
- 每一次執行 **類名() **返回的內存地址引用,都是同一個
**__new__方法
**
- 使用 類名() 創建對象時, Python的解釋器首先會調用** new **方法為對象 分配內存空間
- Python的解釋器獲得對象的引用后,將引用作為第一個參數,傳遞給 **init **方法
- 重寫 new 方法的代碼非常固定
- 重寫 new 方法一定要 return super(). new (cls)
- 否則 Python的解釋器 得不到對象引用,就不會調用初始化方法
- **new **是一個 靜態方法 ,在調用時需要 主動傳遞 cls 參數
示例
class SingleClass():
# 定義類實例對象
instants=None
# 重寫 __new__ 方法
def __new__(cls,*agrs,**kwargs):
print("創建對象方法.....")
if SingleClass.instants== None:
# 初始化實例對象,調用父類方法
SingleClass.instants=super().__new__(cls)
return SingleClass.instants
def __init__(self):
print("初始化方法。。。。")
# 單例模式 ,不管創建多少次實例,實際上都是同一個
s1=SingleClass()
s2=SingleClass()
s3=SingleClass()
print(s1)
print(s2)
print(s3)
輸出結果
以上的方法雖然解決了對象只會創建一次的問題,但是初始化的方法還會調用多次,消耗內存。 此處可以 增加一個 initFlag 的標記,一但初始化后就打上標記,以后就不再進行初始化。 改造代碼如下:
class SingleClass():
# 定義類實例對象
instants=None
# 定義一個初始化標記
initFlag=False
# 重寫 __new__ 方法
def __new__(cls,*agrs,**kwargs):
if SingleClass.instants== None:
print("創建對象方法.....")
# 初始化實例對象,調用父類方法
SingleClass.instants=super().__new__(cls)
return SingleClass.instants
def __init__(self):
if SingleClass.initFlag:
return
print("初始化方法。。。。")
SingleClass.initFlag=True
# 單例模式 ,不管創建多少次實例,實際上都是同一個
s1=SingleClass()
s2=SingleClass()
s3=SingleClass()
print(s1)
print(s2)
print(s3)
**輸出結果
**
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
內存
+關注
關注
8文章
3037瀏覽量
74148 -
對象
+關注
關注
1文章
38瀏覽量
17407 -
空間
+關注
關注
2文章
48瀏覽量
13659
發布評論請先 登錄
相關推薦
2018年Python面試必看的10個面試題
)lambda函數默認返回表達式的值。你也可以將其賦值給一個變量。lambda函數可以接受任意個參數,包括可選參數,但是表達式只有一個。5.python如何實現單例模式?答:
發表于 07-18 14:52
如何使用Python的類? 優勢有哪些?
Python是一種面向對象的高級語言,因此類對于Python非常重要。類是一個空間,在該空間中變量(屬性/方法)分別存儲。運算符' . '用于調用類的屬性和方法。
發表于 07-30 18:08
單例模式詳解
是private的話,會不更好的封裝該內呢?我主要是應用在使用普通類模擬枚舉類型里,后來發現這就是傳說中的單例模式。構造函數弄成private 就是
發表于 09-27 15:10
?0次下載
python-速成指南
python 提供好用的兩個容器:list 和 dict。插句題外話,其實最好用的容器還是 PHP 提供的關聯數組,一個數組就包括了 python 中 list 和 dict 的全部功能,實在是很贊。
發表于 03-28 16:32
?9次下載
Python類的屬性和方法是什么
編程中我們用類來創建對象。日常生活中的汽車設計圖就是我們Python中的類。日常生活中的小汽車就是Python中的對象。
評論