当前位置: 首页 > news >正文

python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

python 魔法方法补充


1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发

    class F(object):
    
        def __init__(self):
            self.name = 'A'
    
        def hello(self):
            print('hello')
    
        def __getattribute__(self, item):
            print('获取属性,方法',item)
            return object.__getattribute__(self,item)
    
    a = F()
    print(a.name)
    a.hello()
    
    
    获取属性,方法 name
    A
    获取属性,方法 hello
    hello


2 getattr 拦截运算(obj.xx),对没有定义的属性名和实例,会用属性名作为字符串调用这个方法

    class F(object):
        def __init__(self):
            self.name = 'A'
    
        def __getattr__(self, item):
            if item == 'age':
                return 40
            else:
                raise AttributeError('没有这个属性')
    
    f = F()
    print(f.age)
    
    # 40


3 setattr 拦截 属性的的赋值语句 (obj.xx = xx)

class F(object):

    def __setattr__(self, key, value):
        self.__dict__[key] = value

a = F()
a.name = 'alex'
print(a.name)

如何自定义私有属性:

class F(object):  # 基类--定义私有属性
    def __setattr__(self, key, value):
        if key in self.privs:
            raise AttributeError('该属性不能改变')
        else:
            self.__dict__[key] = value


class F1(F):
    privs = ['age','name']  # 私有属性列表

    # x = F1()
    # x.name = 'egon'  # AttributeError: 该属性不能改变
    # x.sex = 'male'


class F2(F):
    privs = ['sex']      # 私有属性列表
    def __init__(self):
        self.__dict__['name'] = 'alex'

        # y = F2()
        # y.name = 'eva'

getitem , setitem, delitem

class F(object):

    def __getitem__(self,item):
        print(item)

    def __setitem__(self,key,value):
        print(key,value)

    def __delitem__(self,key):
        print(key)


f  = F()

f['b']
f['c'] = 1
del f['a']

转载于:https://www.cnblogs.com/big-handsome-guy/p/8618078.html

相关文章:

  • /*在DataTable中更新、删除数据*/
  • A* 简介(Amit's A star Page中译文)
  • 文本挖掘的基本过程
  • python web开发-flask读取txt文件内容
  • (C#)获取字符编码的类
  • codefroces 911G Mass Change Queries
  • Chrome浏览器几个好用的插件
  • SQL——两个表之间的更新:用一个表的字段更新另一个表的字段
  • [root]既然sudo 可以暂时获取root权限,那么为何还需要root这个用户呢
  • A*,IDA*,Dijkstra
  • AES对上传文件解密并加密的实现(JAVA实现)
  • Utilities之EXPIMP小结
  • HPU 1166: 阶乘问题(一)
  • Utilities之EXPIMP小结-续1
  • [原创]Zabbix3.4_API的python示例
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • CentOS 7 修改主机名
  • Codepen 每日精选(2018-3-25)
  • Django 博客开发教程 16 - 统计文章阅读量
  • js正则,这点儿就够用了
  • Laravel5.4 Queues队列学习
  • springMvc学习笔记(2)
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue 个人积累(使用工具,组件)
  • win10下安装mysql5.7
  • 对超线程几个不同角度的解释
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聊聊directory traversal attack
  • 你真的知道 == 和 equals 的区别吗?
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 首页查询功能的一次实现过程
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 线上 python http server profile 实践
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • C# - 为值类型重定义相等性
  • ​第20课 在Android Native开发中加入新的C++类
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​什么是bug?bug的源头在哪里?
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (二)hibernate配置管理
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (实战篇)如何缓存数据
  • (转)c++ std::pair 与 std::make
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)用.Net的File控件上传文件的解决方案
  • ***通过什么方式***网吧
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?