程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【python】類方法、property類屬性、單例模式

編輯:Python

一、類方法

實例方法(默認): python解釋器會自動將對象/實例傳入方法。
類方法(@classmethod):python解釋器會自動將類傳入方法。
靜態方法 ( @staticmethod):python解釋器不會自動傳入任何參數

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

二、property類屬性

可以將類方法定義為類屬性,調用時就不用加(),類似於於調用了一個變量,察覺不到自己調用了一個函數。

例題

類屬性應用需求: 對於京東商城中顯示電腦主機的列表頁面,每次請求不可能把數據庫中的所有內容都顯示到頁面上,而是通過分頁的功能局部顯示,所以在向數據庫中請求數據時就要顯示的指定獲取從第m條到第n條的所有數據 這個分頁的功能包括:
1、 根據用戶請求的當前頁和總數據條數計算出 m 和 n
2、根據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 = page
self.per_page = per_page
# 類屬性: 將類方法變成類屬性的過程。
@property
def start(self):
return (self.page-1) * self.per_page
@property
def end(self):
return self.page * self.per_page
if __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]) #因為類屬性所以page.start()可以改為page.start

三、單例模式

1、基本認識
一個類只能構建一個對象的設計模式
單例模式的地址不同

class People():
pass
p1 = People()
p2 = People()
print(p1, p2)
print(p1 is p2) # 判斷是否為單例模式(p1和p2內存地址是否相同)
#結果
<__main__.People object at 0x000002272C502560> <__main__.People object at 0x000002272C502650>
False

2、基於裝飾器的實例化

1、為了保證單例模式, 判斷該類是否已經實例化為對象
2、 如果有對象,直接返回存在的對象
3、如果沒有則實例化對象, 並存儲類和對象到字典中, 最後返回對象
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] = object
return object
return wrapper
@singleton
class People(object):
pass
class People():
pass
p1 = People()
p2 = People()
print(p1, p2)
print(p1 is p2) # 判斷是否為單例模式(p1和p2內存地址是否相同)
#結果
<__main__.People object at 0x0000020350F37FD0> <__main__.People object at 0x0000020350F37E80>
False

3、基於new方法實現的單例模型

1、new方法就是一個創建的·過程
2、類方法在創建對象之前執行
3、在new方法之後執行, 將屬性和對象封裝在一起
class People(object):
_instance = None
def __new__(cls, *args, **kwargs):
"""創建對象之前執行的內容"""
if cls._instance is None:
cls._instance = object.__new__(cls)
return cls._instance
def __init__(self):
"""在new方法之後執行, 將屬性和對象封裝在一起"""
print("正在執行構造方法init......")
p1 = People()
p2 = People()
print(p1, p2)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved