使用__slots__ 内存优化

对于数据定义类,可以通过__slot__来指定属性名,限定类的实例属性,优化实例之后的对象存储,减小内存开销。

class A:
    __slots__ = ['year', 'month', 'day']

    def __init__(self, month, year, day):
        self.year = year
        self.day = day
        self.month = month

class B:
    def __init__(self, month, year, day):
        self.year = year
        self.day = day
        self.month = month

a = A('08', '2017', '14')
b = B('08', '2016', '29')
print(dir(a))  # a实例中有 'day', 'month', 'year' 无 __dict__ 内置属性
print(dir(b))  # b 中有实例属性
print(b.__dict__)  # {'year': '2016', 'day': '29', 'month': '08'} 

通过上面例子可以看出,在没有定义 __slots__ 的类实例出来的属性是没有 __dict__ 这个属性的,相较于普通类的实例,这样将会节省一个字典的空间。对于有大量数据定义的类来说内存优化还是很明显的,同样利用这个特性也可以限定类的实例属性指定。

抽象类

抽象类可以通过两种方式定义。

from abc import ABCMeta, abstractmethod

class A(metaclass=ABCMeta):
    # 方法一
    @abstractmethod
    def read(self):
        pass

    # 方法二
    def write(self):
        raise NotImplementedError

class B(A):
    def read(self):
        pass

b = B()
print(b.write()) 

当然一般情况下混用两者也没什么关系.