自己动手做爬虫7

深入对象与类
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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值