派生内置不可变类型

1月 29, 2021 1145点热度 4人点赞 0条评论
1、派生内置不可变类型并修改其实例化

需求:我们想定义一种新的类型的元组,对于传入的可迭代对象,我们只保留其中int类型值大于0的元素

实现:可以通过tuple来重写__new__()方法来实现;

定义IntTuple类型

IntTuple([2,-2,"yy",["a","b"],6])
>>> (2,6) # 取到 (2,6)

file

class IntTuple(tuple):
    # 重写了父类的构造方法
    def __new__(cls, iterable):
        # 父类中的__new__()方法,必须要传入一个iterable对象
        # 判断必须为整数,并且i大于0的值
        f = [i for i in iterable if isinstance(i,int) and i > 0]
        return super().__new__(cls, f)

int_t = IntTuple([2,-2,"yy",["a","b"],6])
print(int_t)  # (2, 6)
2、创建大量实例节省内存

如何降低大量实例内存的开销?

可以定义__slots__属性,比起字典及列表更小的内存消耗。

class Player1(object):
    __slot__ = ("uid", "name", "status") # 元组内存消耗最小
    def __init__(slef, uid, name, status):
        self.uid = uid
        self.name = name
        self.status = status

class Player2(Player1):
    def __init__(self, uid, name, status)
        self.uid = uid
        self.name = name
        self.status = status

# 实例化两个类
p1 = Player1("1", "yy", 1)
p2 = Player2("2", "xy", 1)

# 增加level属性
p1.__dict__["level"] = 1
# 打印结果
print(p1.__dict__)

"""
跟踪内存的使用
"""
import tracemalloc
tracemalloc.start() # 开始跟踪内存
pla_1 = [Player(1,2,3) for i in range(10000)]

snapshot = tracemalloc.take_snapshot()
top = snapshot.statistics("filename") # 跟踪文件内存

for start in top[:10]:
    print(start)

_slot_ 不影响子类实例,不会继承,除非子类里面自己定义了_slot_

YY部落站(Admin)

当你能梦的时候就不要放弃梦~😎

文章评论