__slots__和@property

__slots__,封装属性

__slots__常见的的用法是用来封装属性,限制对实例胡乱添加属性。然而他还有一个重要的作用是可以减少内存使用。
当定义了__slots__属性时,Python就会针对实例采用一种更加紧凑的内部表示。不在让每个实例都创建一个__dict__字典,现在的实例是围绕着一个固定长度的小型数组来构建的,这和一个元组或者列表很相似。在__slots__中列出的属性名会在内部映射到这个数组的特定索引上。使用__slots__所带来的副作用是我们没法在对实例添加任何新的属性了——我们被限制在只允许使用__slots__中列出的那些属性名。

class Date(object):
    __slots__ = ['year', 'month', 'day']

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

d = Date('2017', '11', '21')
print(d.year+'-'+d.month+'-'+d.day)
#输出
2017-11-21

#设置属性hour
d.hour = '19'
#报错
AttributeError: 'Date' object has no attribute 'hour'

@property,创建可管理的属性

在对实例属性的获取和设定上,如果希望能够增加一些额外的处理过程(如类型检查或者验证),一种简单的方式是将其定义为property(也即把类中定义的函数当做一种属性来使用)。

class A(object):

    def __init__(self, name):
        self.name = name

    # 将name定义为property属性,此处增加了增加了对name属性的修饰
    @property
    def name(self):
        return 'my name is: ' + self._name

    # 将可选方法setter绑定到name属性上,设定属性时做类型检查
    @name.setter
    def name(self, value):
        if not isinstance(value, str):
            raise TypeError('Expect a string')
        self._name = value

    # 将可选方法deleter绑定到name属性上,此处设置为属性不可删除
    @name.deleter
    def name(self):
        raise AttributeError('Cannot delet attribute!')

a = A('a')
a.name = 'shexuan'
print(a.name)
#输出
my name is: shexuan

#设置name属性为int(10)
a.name = 10
#报错
TypeError: Expect a string
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,569评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,062评论 25 709
  • 我独自走在乡间的小道上,去寻找祖父母口中的那袋旧物,那究竟是什么东西承载了怎样的回忆能让老人们念念不忘?我靠着零碎...
    清丞Liuli阅读 265评论 0 0
  • 我是属于那种特别浮躁的人,做点事情静不下心来,没有那种‘沉着’的勇气。自己也知道,这是我的一大缺点,然而想改总是那...
    夏以乔木阅读 366评论 0 1
  • 首先说一下我的ReactNative的版本是0.43.4,Android6.0(华为荣耀6Plus),以下遇到的坑...
    Dony阅读 2,113评论 0 3

友情链接更多精彩内容