網站首頁 編程語言 正文
概念
所有Python的對象都是擴展的PyObject,python的垃圾回收機制是計算引用,這個對象中定義了py_ssize就是用來做這個事的。類型對象可以理解為就是自定義的class。在Python中函數間傳遞的是都是泛型指針,所以可以通過PyObject的ob_type屬性來判斷實際的類型,這也是多態的一種表現。
在Python中的垃圾回收機制比較特殊,它采用了內存對象池技術,對象釋放的空間歸還給內存池,如果再使用可以從內存池中獲取如果確實不再使用時再回收,與java比較相似。所有的內置對象都有自己所特有的對象緩沖池機制。這種緩沖池中的對象都是不可變對象,池中的對象是共享的,但也不會引起多并發的問題。
一、基礎
1.1、toString方法
class FormatChange:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f'use repr method: ({self.x}, {self.y})'
def __str__(self):
return f'use str method: ({self.x}, {self.y})'
fc = FormatChange(5, 7)
print(fc.__repr__()) # use repr method: (5, 7)
print(fc) # use str method: (5, 7)
print(f'fc is {fc!r}') #!r表示用repr方法代替str方法輸出
1.2、格式化輸出
format_dict = {
'ymd': '{d.year}-{d.month}-{d.day}',
'mdy': '{d.month}/{d.day}/{d.year}',
'dmy': '{d.day}/{d.month}/{d.year}'
}
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def __format__(self, format_type='ymd'):
#format_type: 格式化類型,默認使用 ymd 方式
if not format_type:
format_type = 'ymd'
fmt = format_dict[format_type]
return fmt.format(d=self)#這里的format是一個鉤子函數
curr_data = Date(2020, 5, 6)
#這處其實調用的format是一個類庫中的方法,然后反向調用了自定義覆寫的format方法
print(f'default format: {format(curr_data)}') #2020-5-6
print(f"use mdy format: {format(curr_data, 'mdy')}") #5/6/2020
1.3、創建大對象
用slots創建的對象,其內存占用會減少2/3左右。但缺點是不能再給對象添加新的屬性了,也不能實現繼承,所以一般時候只把他做為內存優化工具,用于存儲大量的數據使用。
class Date:
__slots__ = ['year', 'month', 'day']
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
二、高級用法
2.1、通過字符串式調用函數
import math
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f'Point({self.x!r:},{self.y!r:})'
def distance(self, x, y):
return math.hypot(self.x - x, self.y - y)
#第一種方式:這種方式感覺用處不是太大,前面還是得new一個對象
p = Point(2, 3)
d = getattr(p, 'distance')(0, 0)
import operator
operator.methodcaller('distance', 0, 0)(p)
#用相同的參數多次調用某個方法時
points = [
Point(1, 2),
Point(3, 0),
Point(10, -3),
Point(-5, -7),
Point(-1, 8),
Point(3, 2)
]
#第二種使用方法: Sort by distance from origin (0, 0)
points.sort(key=operator.methodcaller('distance', 0, 0))
p = Point(3, 4)
d = operator.methodcaller('distance', 0, 0)
print(f'd(p) = {d(p)}')#5.0
2.2、上下文管理器
需要自定義實現enter和exit方法。一般用于網絡連接等工具類中,代碼放在with語句中執行,當出現with時enter方法被調用,返回的值賦值給as后的變量。然后with中的語句開始執行。最后exit被執行進行一些清理工作。在exit方法中自帶了異常處理,如果忽略異??煞祷豊one,如果返回True那么異常會被清空。下面是兩個實現:一個是工具類,另一個是允許嵌套的工廠類:
簡單實現:
from socket import socket, AF_INET, SOCK_STREAM
class LazyConnection:
def __init__(self, address, family=AF_INET, type=SOCK_STREAM):
self.address = address
self.family = family
self.type = type
self.sock = None
def __enter__(self):
if self.sock is not None:
raise RuntimeError('Already connected')
self.sock = socket(self.family, self.type)
self.sock.connect(self.address)
return self.sock
def __exit__(self, exc_ty, exc_val, tb):
self.sock.close()
self.sock = None
from functools import partial
conn = LazyConnection(('www.python.org', 80))
# Connection closed
with conn as s:
# conn.__enter__() executes: connection open
s.send(b'GET /index.html HTTP/1.0\r\n')
s.send(b'Host: www.python.org\r\n')
s.send(b'\r\n')
resp = b''.join(iter(partial(s.recv, 8192), b''))
原文鏈接:https://blog.51cto.com/arch/5399671
相關推薦
- 2022-11-05 C/C++讀取大文件數據方式詳細講解_C 語言
- 2022-04-25 淺談Golang?Slice切片如何擴容的實現_Golang
- 2021-10-22 C#?基于NAudio實現對Wav音頻文件剪切(限PCM格式)_C#教程
- 2022-02-13 使用filter過濾器計算數組中符合條件的長度
- 2022-05-03 EF使用Code?First模式給實體類添加復合主鍵_實用技巧
- 2022-07-04 Python自動化辦公之清理重復文件詳解_python
- 2022-04-04 小程序Arrow function should not return assignment
- 2022-05-24 ASP.NET?MVC使用異步TPL模式_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支