深入物件與類
import sys
class player():
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level
class player2(object):
__slots__ = ['uid','name','status','level']#關閉動態屬性
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level
p1 = player(1,'sansan')
print(dir(p1))
print(p1.__dict__)#動態繫結屬性
p1.age = 18
print(p1.__dict__)
p2 = player2(2,'ss')
print(dir(p2))
# p2.age = 18
# print(p2.__dict__)#沒有的
print(set(dir(p1))-set(dir(p2)))
print(sys.getsizeof(p1.__dict__))
print(sys.getsizeof(p1.name))
print(sys.getsizeof(p1.uid))
#dir()自省機制
#在python中動態屬性是用__dict__繫結的
跟蹤記憶體使用
tracemalloc —跟蹤記憶體分配的參考**參考**
class player():
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level #size=10.7 mib __dict__所佔的記憶體
class player2(object):
__slots__ = ['uid','name','status','level']#關閉動態屬性,不讓你瞎加屬性
def __init__(self,uid,name,status = 0, level = 0):
self.uid = uid
self.name = name
self.status = status
self.level = level
import tracemalloc
tracemalloc.start()
# p1 = [player(1,'ss') for _ in range(100000)] #size=6274 kib size=16.8 mib
p2 = [player2(1,'ss') for _ in range(100000)] #size=7837 kib size=7837 kib
snapshot = tracemalloc.take_snapshot()
# top_stats = snapshot.statistics('lineno')
top_stats = snapshot.statistics('filename')
for start in top_stats[:10]:
print(start)
上下文管理器#上下文管理器
'''with open() as f:
pass
若要把類變成乙個檔案,要在內部實現下列兩種方法
__enter__
__exit__
'''# class play(object):
# def __enter__(self):
# print("start")
# return self
# #獲取資源
# #進入物件的執行時上下文, with語句會把這個方法的返回值賦給as指定的變數.
# def __exit__(self, exc_type, exc_val, exc_tb):
# #釋放資源
# print("end")
## def info(self):
# print("info")
## with play() as d:
# d.info()
#簡化上下文管理器
import contextlib
#可以把函式裝飾成上下文管理器
@contextlib.contextmanager
def file_open(filename):
print("file open")
#生成器
yield{}
print("file end")
with file_open("11.txt") as f:
print("file option")
類支援比較操作from functools import total_ordering
@total_ordering #這樣我們只需完成其中的兩個方法就可以比較所有
class rect(object):
def __init__(self,w,h):
self.w = w
self.h = h
def area(self):
return self.w*self.h
def __lt__(self, other):
return self.area() < other.area()
def __eq__(self, other):
return self.area() == other.area()
def __str__(self):
return "rect:(%s,%s)"%(self.w, self.h)
rect1 = rect(1,2)
# rect1 = rect(3,2)
import math
class circle(object):
def __init__(self,r):
self.r = r
def area(self):
return self.r**2*math.pi
def __lt__(self, other):
return self.area() < other.area()
def __eq__(self, other):
return self.area() == other.area()
c = circle(3)
print(c > rect1)
自己動手做網線
幾天沒在,公司位置上的網線就不翼而飛了,鬱悶,還是要硬著頭皮再到人事處申請做一根。可問題又來了,上次還是請別人幫我做的,現在怎麼好意思再求他呢。無奈,我決定自己嘗試做一下,其實也沒有什麼難的,只是從沒做過,心裡沒底,更怕不小心做壞了 還是到人事拿材料,甚是麻煩的。鼓了下勇氣,我就開始自己動手做了。之...
動手做自己的雲計算
面對雲計算,有的人越來越糊塗,經常聽到有人用雲裡霧裡來形容現在的雲計算。雲計算系統確實是乙個龐大和綜合的系統,即使是國際大公司也不敢貿然進軍雲計算領域,大量的企業不是將自己的傳統技術優勢稱為雲計算,就是雷聲大雨點小的觀望。一般開發者更是不適應在機群的環境下工作,所以本章將用乙個簡單的例子來展現雲計算...
自己動手做Arduino玩具(二)
雖然定下來要做這個玩具,但一下子是完成不了這麼多的功能的。那我們先做乙個簡單的東西,接著再迭代更新。首先,我們先做乙個簡單的靶。這個靶我選用的是乙個紅外的接收管來做,簡單來,就是用乙個紅外發射器作為槍,用紅外置收管作為靶,如果這個靶收到紅外線的訊號,那麼就當成是打中靶了。經過我一輪的比較及在 上買買...