getattr, __getattr__, __getattribute__和__get__区别

这篇具有很好参考价值的文章主要介绍了getattr, __getattr__, __getattribute__和__get__区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、getattr()

和另外三个方法都是魔法函数不同的是,getattr()是python内置的一个函数,它可以用来获取对象的属性和方法。例子如下:

class A():
    a = 5
    def __init__(self, x):
        self.x = x

    def hello(self):
        return 'hello func'

a = A(10)

print(getattr(a, 'x'))  #相当于a.x
print(getattr(a, 'y', 20))  #相当于a.y,因为a.y并不存在,所以返回第三个参数作为默认值
print(getattr(a, 'hello')())  # 相当于a.hello()

print(getattr(A, 'a'))  # 相当于A.a

这段代码的输出结果是:

10
20
hello func
5

可以看出,getattr()可以用来获取对像的属性和方法,需要注意的是,如果通过getattr()来尝试获取对象里并不存在的属性时没有添加第三个默认值,代码会 报错,如下所示:

print(getattr(a, 'y'))

运行会报异常提示找不到属于y:

Traceback (most recent call last):
  File "app/test.py", line 32, in <module>
    print(getattr(a, 'y'))
AttributeError: 'A' object has no attribute 'y'

二、__getattr()与__getattribute()

这两个是类对象的魔法函数,在访问对象属性的时候会被调用,但是两者之间也有一点区别, 我们通过代码来看一下:

class A(object):
  def __init__(self, x):
    self.x = x

  def hello(self):
    return 'hello func'

  def __getattr__(self, item):
    print('in __getattr__')
    return 100

  def __getattribute__(self, item):
    print('in __getattribute__')
    return super(A, self).__getattribute__(item)

a = A(10)
print(a.x)
print(a.y)

运行代码,得到下面输出:

in __getattribute__
10
in __getattribute__
in __getattr__
100

可以看出,在获到对象属性时,__getattribute__()是一定会被调用的,无论属性存不存在,首先都会调用这个魔法方法。 如果调用像a.y这种不存在的对象时,调用__getattribute__()找不到y这个属性,就会再调用__getattr__()这个魔法方法,可以通过在这个方法里实 来设置属性不存在时的默认值。使用上面的getattr()方法获取属性时,也是同样的调用关系,只不过只有在getattr()带第三个参数作为默认值时,才会调用 __getattr__()方法。

三、__get__()

__get__() 是一个描述符协议(Descriptor Protocol)中的魔法函数,用于定义描述符对象的获取行为。描述符是一种特殊的对象,用于控制对属性的访问。描述符可以被用作类的属性,通过访问和设置描述符属性,可以触发 __get__()__set__() 和 __delete__() 等方法。

在描述符协议中,当通过实例访问描述符属性时,解释器会自动调用描述符对象的 __get__() 方法,并传入三个参数:

  • self: 描述符对象自身的实例。
  • instance: 调用描述符的实例对象。
  • owner: 描述符所属的类对象。

__get__() 方法的返回值将作为属性的值返回给调用方。

下面是一个简单的示例,演示了如何使用 __get__() 方法定义一个描述符:

class Descriptor:
    def __get__(self, instance, owner):
        print("Getting the value")
        return instance._value

    def __set__(self, instance, value):
        print("Setting the value")
        instance._value = value

class MyClass:
    descriptor = Descriptor()

    def __init__(self, value):
        self._value = value

my_obj = MyClass(42)
print(my_obj.descriptor)  # 输出: Getting the value, 42
my_obj.descriptor = 100   # 输出: Setting the value
print(my_obj.descriptor)  # 输出: Getting the value, 100

 getattr, __getattr__, __getattribute__和__get__区别,python,python,开发语言

在上述示例中,Descriptor 类是一个描述符,它定义了 __get__() 和 __set__() 方法。MyClass 类中的 descriptor 属性是一个描述符实例。当通过 my_obj.descriptor 访问该属性时,会触发 Descriptor 类中的 __get__() 方法,并返回 _value 属性的值。当给 my_obj.descriptor 赋值时,会触发 Descriptor 类中的 __set__() 方法,将新的值赋给 _value 属性。

需要注意的是,描述符协议还包括 __set__() 和 __delete__() 方法,用于定义设置和删除描述符属性的行为。这些方法可以根据需要进行实现,以控制描述符属性的行为。

 

参考:

getattr, __getattr__, __getattribute__和__get__区别 - 知乎文章来源地址https://www.toymoban.com/news/detail-596938.html

到了这里,关于getattr, __getattr__, __getattribute__和__get__区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 由浅入深C系列五:使用libcurl进行基于http get/post模式的C语言交互应用开发

    大多数在linux下的开发者,都会用到curl这个命令行工具。对于进行restful api的测试等,非常方便。其实,这个工具还提供了一个C的开发库,可以很方便的在C语言开发环境下完成基于http的请求和响应交互,高效的开发基于http/smtp等的网络应用程序 下载并安装curl的开发包 开发

    2024年02月13日
    浏览(45)
  • get和post的区别

    1.幂等性 由于get是读,post是写,因此get请求是幂等的,post不是幂等的 由于get是读,post是写,get请求可以被缓存,post请求无法被缓存 由于get是读,post是写,get方式可以收藏为书签,post方式不可以 幂等性是指一个资源无论请求多少次的效果都是一样的 2.请求参数 get方式的请

    2024年01月18日
    浏览(78)
  • GET 和 POST 方式区别

    目标: 理解 GET 和 POST 请求方式的区别 分支名: get_post 注意: 后端采用 express 编写 ●npm i 安装依赖 ●npm run start 启动后端接口项目 ●即可在前端发起测试 效果 可以自行查看 network 里, 发现 GET 方式无法携带请求体, 浏览器做的限制 项目运行效果说明:后端会把收到的 GET / POS

    2024年02月21日
    浏览(40)
  • 【爬虫】get 和 post 的区别

    get 和 post请求是http协议中的两种请求方式。 get一般用来获取服务器的信息的,post一般是用来更新信息。 1)get请求的参数会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以相连;POST 请求的参数,放在 Request body中。 所以,GET比POST更不安全

    2024年02月12日
    浏览(38)
  • get和post请求的区别

    GET和POST是HTTP请求的两种方法,其区别如下 ① GET请求表示从指定的服务器中获取数据(请求数据),比如查询用户信息;POST请求表示将数据提交到指定的服务器进行处理(发送数据), ② GET请求是一个幂等的请求,一般用于对服务器资源不会产生影响的场景,比如说请求一个网

    2024年02月10日
    浏览(43)
  • 【HTTP】GET 和 POST 的区别

    首先: GET 和 POST 没有本质区别, 具体来说, GET 的使用场景可替换为 POST,POST 使用的场景也可以替换为 GET. 语义上的区别: GET 通常用来获取数据, POST 通常用来上传数据. 现状是 GET 也经常用来上传数据, POST 也经常用来获取数据. 数据存放的位置不同: GET 没有 body, GET 通过 query str

    2024年02月07日
    浏览(44)
  • HTTP Get 和 Post 的区别

    使用规范 根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。 根据HTTP规范,POST表示可能修改变服务器上的资源的请求。 传递参数 GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中)。 POST把提交的数据则放置在是HTTP包的包体中。 安全性 POST的安全性要

    2024年02月10日
    浏览(38)
  • POST请求与GET请求的区别

    (提交数据,一般用于将数据发给服务器,用于修改和写入数据) 1、传参方式:相对安全,入参在request body中,可通过各种抓包工具获取 2、缓存:不会被缓存,保存在服务器日志记录以及浏览器浏览记录中 3、请求内容限制:可以发送的数据更大,能发送更多数据类型 4、

    2024年02月07日
    浏览(47)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(51)
  • 登录时发起的请求是Get还是Post?Get和Post的区别

    为了保证信息的安全性,注册、登录等操作通常都会使用 POST 请求, GET 请求一般用来获取信息 1. 根据HTTP规范,GET用于信息获取。 GET 请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以相连,如: login.action? GET 方式提交的数据最

    2024年02月13日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包