对于数据定义类,可以通过__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())
当然一般情况下混用两者也没什么关系.