自己动手做爬虫7

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43999482/article/details/102768799

深入对象与类

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)



猜你喜欢

转载自blog.csdn.net/weixin_43999482/article/details/102768799
今日推荐