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

歡迎訪問 生活随笔!

生活随笔

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

python

Python面向对象的高级特性

發布時間:2024/9/3 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python面向对象的高级特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、類方法與靜態方法

類方法是類對象所擁有的方法,需要用修飾器一般以@classmethod來標識其為類方法,
1). 對于類方法,第一個參數必須是類對象,作為第一個參數
(cls是形參, 可以修改為其它變量名,但最好用’cls’了)
2). 能夠通過實例對象和類對象去訪問。

""" 相關的源碼:from datetime import datetime """class Student(object):def __init__(self, name, age):self.name = nameself.age = age# 實例方法, python解釋器會自動將對象/實例傳入方法。def get_age(self):print('self:', self)return self.age# 類方法:python解釋器會自動將類傳入方法。@classmethoddef get_cls(cls):print('cls:', cls)# 靜態方法:python解釋器不會自動傳入任何參數@staticmethoddef get_info():print("static method信息")if __name__ == '__main__':s = Student('張三', 18)s.get_age()s.get_cls()s.get_info()

代碼運行結果:

二、property類屬性

一種用起來像是使用的實例屬性一樣的特殊屬性,可以對應于類的某個方法。
property屬性的定義和調用要注意一下幾點:
1.定義時,在實例方法的基礎上添加 @property 裝飾器;并且僅有一個self參數
2.調用時,無需括號

類屬性應用需求: 對于京東商城中顯示電腦主機的列表頁面,每次請求不可能把數據庫中的所有內容都顯示到頁面上,而是通過分頁的功能局部顯示,所以在向數據庫中請求數據時就要顯示的指定獲取從第m條到第n條的所有數據 這個分頁的功能包括:

  • 根據用戶請求的當前頁和總數據條數計算出 m 和 n
  • 根據m 和 n 去數據庫中請求數據
""" 類屬性應用需求: 對于京東商城中顯示電腦主機的列表頁面,每次請求不可能把數據庫中的所有內容都顯示到頁面上,而是通過分頁的功能局部顯示,所以在向數據庫中請求數據時就要顯示的指定獲取從第m條到第n條的所有數據 這個分頁的功能包括: - 根據用戶請求的當前頁和總數據條數計算出 m 和 n - 根據m 和 n 去數據庫中請求數據from datetime import datetime """class Page(object):"""[user1, user2, user3......user100]page=2, per_page=10第一頁: start=0 end=10第二頁: start=10 end=20第三頁: start=20 end=30....第page頁: start=(page-1)*per_page end=page*per_page"""def __init__(self, page, per_page=10):self.page = pageself.per_page = per_page# 類屬性: 將類方法變成類屬性的過程。@propertydef start(self):return (self.page-1) * self.per_page@propertydef end(self):return self.page * self.per_pageif __name__ == '__main__':goods = ['good'+str(i+1) for i in range(100)]page = Page(page=10, per_page=3)print(goods[page.start:page.end])


簡單實例:

class date(object):def __init__(self,year,month,day):#私有屬性self.__year = yearself.__month = monthself.__day = day# 將類方法object.year()轉變成類屬性object.year,只是為了代碼簡潔@propertydef year(self):return self.__yeartoday = date(2021,3,6) print(today.year) #2021

三、單例模式

為什么使用單例模式?

對于系統中的某些類來說,只有一個實例很重要,例如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行唯一化,將彈出多個窗口,如果這些窗口顯示的內容完全一致,則是重復對象,浪費內存資源;如果這些窗口顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪一個才是真實的狀態。因此有時確保系統中某個對象的唯一性即一個類只能有一個實例非常重要。

class People(object):pass p1 = People() #object p2 = People() #object print(p1,p2) #每個對象的內存地址不同,所以肯定不是單例模式

實現方法

裝飾器實現

裝飾器(decorator)可以動態地修改一個類或函數的功能。這里,我們也可以使用裝飾器來
裝飾某個類,使其只能生成一個實例,代碼如下

from functools import wraps def singleton(cls):#通過一個字典存儲類和對象信息{"Class":"object"}instances = {}@wraps(cls)def wrapper(*args,**kwargs):#為了保證單例模式,判斷該類是否已經實例化為對象# 1.如果有對象,直接返回存在的對象# 2.如果沒有則實例化對象,并存儲類和對象到字典中,最后返回對象if instances.get(cls):return instances.get(cls)object = cls(*args,**kwargs)instances[cls] = objectreturn objectreturn wrapper@singleton class People(object):passp1 = People() p2 = People() print(p1,p2) print(p1 is p2) #判斷是否為單例模式,對比p1和p2的內存地址是否相同

new方式實現

class People(object):_instance = Nonedef __new__(cls, *args, **kwargs):"""創建對象之前執行的內容"""if cls._instance is None:cls._instance = object.__new__(cls)return cls._instancedef __init__(self):"""在new方法之后執行, 將屬性和對象封裝在一起"""print("正在執行構造方法init......")p1 = People() p2 = People() print(p1, p2)

總結:

""" 面向對象:1. 三大特性封裝(必須要掌握的):__new__: 在實例化對象之前執行的, 返回對象。__init__: 構造方法, 實例化對象時自動執行。 常用于將對象和屬性綁定在一起。self: 實質上是對象。繼承(最多知識點的):多繼承算法: python3中廣度優先算法。私有屬性和私有方法多態(最簡單的):2. 三大特性的應用1). 鏈表的封裝(Leetcode第二題)2). 棧的封裝3). 隊列的封裝4). 二叉樹的封裝與先序遍歷3. 高級特性1). @classmethod和@staticmethod(類方法和靜態方法)2). @property類屬性3). 單例模式: 一個類只能實例化一個對象基于裝飾器基于new方法 """

總結

以上是生活随笔為你收集整理的Python面向对象的高级特性的全部內容,希望文章能夠幫你解決所遇到的問題。

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