__set__,__setattr__,__getattr__等几个方法区别小记

__get__,__set__,__delete__

设计描述符descriptor需要使用

# A descriptor
class String:
    def __init__(self, name):
        self.name = name

    def __get__(self, instance, cls):
        if instance is None:
            return self
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, str):
            raise TypeError('Expected a string')
        instance.__dict__[self.name] = value


# A class with a descriptor
class Person:
    name = String('name')

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


# Extending a descriptor with a property
class SubPerson(Person):
    """这个子类把属性的三个方法都重写了
    """

    @property
    def name(self):
        print('Getting name')
        return super().name

    @name.setter
    def name(self, value):
        print('Setting name to ', value)
        super(SubPerson, SubPerson).name.__set__(self, value)  # __set__是属性的方法

    @name.deleter
    def name(self):
        print('Deleting name')
        super(SubPerson, SubPerson).name__delete__(self)

__getattr__, __getattribute__,getattr

  • __getattr__
    获取对象属性时使用,当找不到属性时就会调用这个方法,我们可以重写这个方法来实现一些特殊功能,比如给个默认值啥的
  • __getattribute__
    获取对象属性使用,这个是任何情况下都会隐式调用的方法。实际上这个方法会在 __getattr__之前调用
  • getattr
    内置函数,getattr(object, name, default=None)

setattr, __setattr__

  • setattr
    内置函数,setattr(object, name, default=None)
  • __setattr__
    给对象赋予属性值时使用

__getitem__, __setitem__

给对象进行容器化可以对类实现这个函数

class A:
    def __setitem__(self, key, value):
        setattr(self, key, value)

    def __getitem__(self, key):
        return getattr(self, key)
a = A()
a.x = 3
print(a["x"])
----
output:3

如上,可见,通过容器化,使得获取对象的属性有点像访问dict或是list这样的容器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 人生苦短我用 Python 注:最后附电子书地址 一、Pythonic Thinking 第1条: 确认自己所用的...
    molscar阅读 2,079评论 0 3
  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 1,291评论 0 0
  • Python史上最全开发总结(转自静熙老师哈哈哈) 两本不错的书: 《Python参考手册》:对Python各个标...
    春风在抱阅读 775评论 1 4
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 3,013评论 0 9
  • 昨天,比赛终于结束了。 结果还没出来,无所谓兴奋,无所谓遗憾,最大的感受就是终于解脱了。在信息化大赛群里,大家都发...
    文无用阅读 394评论 0 0