自己動手做爬蟲7

2021-09-29 02:12:39 字數 3593 閱讀 9051

深入物件與類

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玩具(二)

雖然定下來要做這個玩具,但一下子是完成不了這麼多的功能的。那我們先做乙個簡單的東西,接著再迭代更新。首先,我們先做乙個簡單的靶。這個靶我選用的是乙個紅外的接收管來做,簡單來,就是用乙個紅外發射器作為槍,用紅外置收管作為靶,如果這個靶收到紅外線的訊號,那麼就當成是打中靶了。經過我一輪的比較及在 上買買...