自定义属性访问

__getattr__属性

什么时候触发:

当我们访问属性的时候,如果属性不存在,则触发此方法;

class MyTest:
    def __getattr__(self, item):
        #   当访问的属性不存在时,该方法会被触发
        print("触发__getattr__属性")
        super().__getattribute__(item)

mt = MyTest()
mt.name

执行结果:
    mt.name
  File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 32, in __getattr__
    super().__getattribute__(item)
AttributeError: ‘MyTest‘ object has no attribute ‘name‘
触发__getattr__属性

官方文档给出:该方法应当返回一个属性值,或者引发一个异常;

__getattribute__属性

什么时候触发:

查找属性的时候,第一时间触发该方法去查找属性;

class MyTest:
    def __getattr__(self, item):
        #   当访问的属性不存在时(报AttrError异常时),该方法会被触发
        print("触发__getattr__方法")
        super().__getattribute__(item)

    def __getattribute__(self, item):
        #   当访问属性的时候,第一时间触发此方法去查找属性
        print("触发__getattribute__方法")
        return object.__getattribute__(self,item)

mt = MyTest()
mt.name

执行结果:
触发__getattribute__方法
Traceback (most recent call last):
触发__getattr__方法
  File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 43, in <module>
    mt.name
  File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 33, in __getattr__
    super().__getattribute__(item)
AttributeError: ‘MyTest‘ object has no attribute ‘name‘

通过上面的例子,我们可以看到,当访问属性的时候,首先触发的是__getattribute__方法,由于访问的属性name不存在,于是触发__getattr__方法

__setattr__属性

什么时候触发:

当设置属性的时候触发;

class MyTest:

    def __setattr__(self, key, value):
        #   这个方法是在给对象设置属性的时候触发
        print("触发__setattr__方法")
        super().__setattr__(key,value)  #  key是属性名,value是属性值

mt = MyTest()
mt.name = 10
print(mt.name)

执行结果:
触发__setattr__方法
10

可以通过自定义此方法,在设置属性之前做操作

__delattr__属性

class MyTest:

    def __delattr__(self, item):
        # 这个方法在删除属性的时候触发
        print("触发__delattr__方法")
        super().__delattr__(item)  #   item是属性名

mt = MyTest()
mt.name = 10
del mt.name  #  删除属性
print(mt.name)

执行结果:
触发__delattr__方法
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/untitled/test.py", line 55, in <module>
    print(mt.name)
AttributeError: ‘MyTest‘ object has no attribute ‘name‘

通过上面的例子,我们可以发现,当删除属性的时候,触发__delattr__方法,我们可以通过定义此方法,在删除属性之前做操作;

****总结:

上面的四个方法都要调用父类的相应方法,是因为,重新定义属性方法后,没有各自对应的能力了,只有调用相应的父类的方法才能到达要求;

原文地址:https://www.cnblogs.com/lzh501/p/10920711.html

时间: 2024-10-17 16:22:25

自定义属性访问的相关文章

17、类的自定义属性访问及动态属性设置

前言:本文主要介绍python类的一些自定义属性访问的方法,以及类的动态属性设置即python的内置函数setattr(). 自定义属性访问 什么是属性?下面的例子a和b是属性吗?不是,他们是全局变量,属性(attribute)是类中的成员变量,也可以理解为属性就是类变量. a = 11234 b = 'python' 类中的变量是静态变量,类可以直接访问,python是一门动态语言,任何实例对象都可以动态地添加或删除属性,一个类定义了一个作用域,类实例对象也引入了一个作用域,这与类定义的作用域

python自定义属性访问__setattr__, __getattr__, __setattribute__

object._getattr_(self, name) 实例instance通过instance.name访问属性name,只有当属性name没有在实例的__dict__或它构造类的__dict__或基类的__dict__中没有找到,才会调用__getattr__.当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的.如果在__getattr__(self, attr)存在通过self.attr访问属性,会出现无限递归错误. class ClassA(object):

复习打卡--0816多态和属性访问

面向对象三大特征: 封装:将数据和方法放在一个类中,构成封装 继承:子类继承父类属性和方法,可多继承 多态:一个事物有多种形态,一个抽象类有多个子类,不同的子类对象调用相同的方法,产生不同的执行结果.多态可以增加代码的灵活度.是基于类的继承. class Animal: def run(self): raise AttributeError('子类必须实现这个方法') class Pig(Animal): def run(self): print('pig is walking') class

Hibernate之核心文件

一个Hibernate项目核心配置文件主要分为以下三个方面:1.配置文件hibernate.cfg.xml:2.配置文件*.hbm.xml,此文件一般包括映射文件的结构以及各种属性的映射方式:3.Hibernate关联关系映射. 1.配置文件hibernate.cfg.xml文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-configuration 3 PUBLIC

iOS开发——语法篇OC篇&amp;高级语法精讲二

Objective高级语法精讲二 Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,进行消息发送和转发.下面通过分析Apple开源的Runtime代码(我使用的版本是objc4-646.tar)来深入理解Objective-C的Runtime机制. Runtime数据结构 在Objective-C中,使用[receiver message]语法并不会马上执行receiver对象的message方

iOS runtime和runloop

runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, 所以大家有必要进行研究,有能力的童鞋可以和下面作者一样, 亲历实践一下. 在简书里发现了两篇非常好的文章介绍 runtime和runloop的,在这里合二为一了, 把原版作者的东西拿了过来, 为了尊重作者,在这里注明一下 @sam_lau 是runtime的作者, @tripleCC是runloop的作者   RunTime Objective-C是基于C语言加入了面向对象特性和消息

DOM&amp;BOM笔记

day01正课:1. DOM概述2. ***DOM树3. *查找 1. DOM概述: DHTML:动态网页技术的统称 DHTML=HTML+CSS+JS 鄙视题: HTML XHTML DHTML XML: HTML:超文本标记语言,专门编写网页内容的语言 XHTML:严格的HTML语言标准 DHTML:动态网页技术的统称,=HTML+CSS+JS XML:可扩展的标记语言,可自定义标签 专门用来存储/传输自描述的结构化数据 逐渐被json替代了 <演员> <姓名>范冰冰</

iOS开发笔试面试- runtime的原理(一)

首先先说一个简书作者的博客,把runtime入门讲得够清晰. http://www.jianshu.com/p/25a319aee33d Objective-C语言使用了面向对象特性和消息转发机制. 一:Runtime的数据结构: 解析:Root class其实就是NSObject,NSObject是没有超类的,所以Root class 的superclass指向nil: 每一个Class都有一个isa指针指向唯一的Meta class: Root class(meta)的superclass指

python死磕三之类与对象

面向对象编程,说起来很抽象,也许一百个人有一百种答案,最基本的三大概念无疑就是:封装,继承和多态,python是一种强类型动态性语言,默认是支持多态的,也就是在对象调用方法时,python会自动检查该对象是否有我们想要调用的方法,不用写特殊的接口类取指定,也不用事先指定该对象的类型. 面向对象相对于面向过程编程,最大的好处就是使项目的耦合性降低,不再使我们的项目牵一发而动全身,将过程解耦,使我们只要单独的修改过程即可. 弄清以下几个问题,会对我们面向对象的思想会有自己的答案. 一.你想改变对象实