前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >五个与Python属性相关的魔术方法

五个与Python属性相关的魔术方法

作者头像
罗罗攀
发布2021-12-06 17:52:48
2920
发布2021-12-06 17:52:48
举报

前言

今天要给大家介绍五个魔术方法,他们都与Python属性相关,涉及获取、删除和修改属性,我们一起来看看吧。

__getattribute__方法

我们先来定义一个简单的类,访问属性没问题。

代码语言:javascript
复制
class User:

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


u1 = User('li', 'male')
print(u1.name)

li

接着我们加入__getattribute__方法后,访问属性就会交给该方法处理。

代码语言:javascript
复制
class User:

    def __getattribute__(self, item):
        return 6

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


u1 = User('li', 'male')
print(u1.name)

6

更加神奇的是,不管这个属性存不存在,都会返回6。

代码语言:javascript
复制
class User:

    def __getattribute__(self, item):
        return 6

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


u1 = User('li', 'male')
print(u1.test)

6
  • 触发时间:在访问对象成员属性的时候触发,无论是否存在。
  • 作用:对属性进行一些处理。
  • 参数:self为当前对象,item是访问属性名称的字符串。
  • 返回值:属性值。

这里需要注意的是返回值千万不能用self.name,这样会无限递归下去,我们可以使用object的__getattribute__方法来访问。

代码语言:javascript
复制
class User:

    def __getattribute__(self, item):
        return object.__getattribute__(self, item)

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


u1 = User('li', 'male')
print(u1.name)

li

__getattr__方法

  • 触发时间:在访问不存在的对象属性的时候触发。
  • 作用:访问不存在的属性时候,不会报错。
  • 参数:self为当前对象,item是访问属性名称的字符串。
  • 返回值:属性值。

我们举个简单例子,就是用户可能会输出属性名称,那我们都统一返回name属性。

代码语言:javascript
复制
class User:

    def __getattr__(self, item):
        return self.name

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


u1 = User('li', 'male')
print(u1.na2me)

li

__setattr__方法

  • 触发时间:添加和修改对象属性的时候触发。
  • 作用:限制添加和修改对象属性的操作。
  • 参数:self为当前对象,key为设置对象属性名称, value为设置的值。
  • 返回值:无。

例如,我们让用户可以改name,不能改sex。

代码语言:javascript
复制
class User:

    sex = 'male'

    def __setattr__(self, key, value):
        if key == 'sex':
            pass
        else:
            object.__setattr__(self, key, value)

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


u1 = User('li')
u1.name = 'test'
u1.sex = 'female'
print(u1.name, u1.sex)

test male

__delattr__方法

  • 触发时间:删除对象属性的时候触发。
  • 作用:限制添加和修改对象属性的操作。
  • 参数:self为当前对象,item为删除对象属性名称。
  • 返回值:无。

我们可以让用户删除sex,但是不能删除name。

代码语言:javascript
复制
class User:

    def __delattr__(self, item):
        if item == 'sex':
            pass
        else:
            object.__delattr__(self, item)

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


u1 = User('li', 'male')
del u1.sex
print(u1.sex)
del u1.name
print(u1.name)

male
AttributeError: 'User' object has no attribute 'name'

__dir__方法

该方法返回类或者对象的所有成员名称列表,用的不是很多。

属性访问顺序

最后,我把属性访问的顺序列给大家,供大家参考学习。

  • __getattribute__
  • 数据描述符
  • 当前对象的属性
  • 类的属性
  • 非数据描述符
  • 父类的属性
  • __getattr__

今天的分享就到这了,我们下期再见~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021/8/27 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • __getattribute__方法
  • __getattr__方法
  • __setattr__方法
  • __delattr__方法
  • __dir__方法
  • 属性访问顺序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档