zoukankan      html  css  js  c++  java
  • 第56天python学习内置attr属性__delattr__ __getattr__ __setattr__


    #包装——————————以下内容

    # class Foo:
    # pass
    #
    # p1=Foo()
    # print(Foo.__dict__)#查看Foo属性,不怎么全
    # print(dir(Foo))#查看Foo所有属性

    #类自带的属性:__delattr__ __getattr__ __setattr__怎么使用

    #取值属性:__getattr__不定义使用出现报错,定义了取值不到值输出__getattr__定义的
    # class Foo:
    # def __init__(self,name):
    # self.name=name
    #
    # def __getattr__(self,item):#定义一个覆盖之前的,如果不定义直接报错
    # print("你找的属性【%s】不存在"%item)
    #
    # f1=Foo("张三")#实例化,因为__init__初始时需要传一个参数
    # print(f1.name)#直接取到值
    #
    # print(f1.age)#如果不定义__getattr__,找不到属性时直接报错,定义了自己执行定义下面的代码



    #添加属性作用:添加属性self.__dict__[key]=value#添加属性格式
    # class Foo:
    # def __init__(self,name):
    # self.name=name
    #
    # def __setattr__(self, key, value):
    # self.__dict__[key]=value#添加属性格式
    #
    #
    # f1=Foo("张三")#实例化,因为__init__初始时需要传一个参数
    # # print(f1.__dict__)#当没有自己定义 __setattr__时,结果为:{'name': '张三'}
    # f1.age=18#直接添加属性
    # print(f1.__dict__)#自己定义 __setattr__时,结果为:{'name': '张三', 'age': 18},添加属性成功



    #删除属性作用:下面情况没有删除————失败的实例
    # class Foo:
    # def __init__(self,name):
    # self.name=name
    #
    # def __delattr__(self, item):
    # print("执行delattr",item)
    #
    #
    # f1=Foo("张三")#实例化,因为__init__初始时需要传一个参数
    # del f1.name#没有删除成功
    # print(f1.__dict__)#结果为:{'name': '张三'}



    #删除属性作用:下面能正常删除
    # class Foo:
    # def __init__(self,name):
    # self.name=name
    #
    # def __delattr__(self, item):
    # print("执行delattr",item)
    # self.__dict__.pop(item)#次方法删除成功
    #
    #
    # f1=Foo("张三")#实例化,因为__init__初始时需要传一个参数
    # del f1.name#删除成功
    # print(f1.__dict__)#结果为:{}



    # 二次加工标准类型(包装):包装:python为大家提供了标准数据类型,以及丰富内置的方法,其实在很多场景下我们都需要基于
    # 标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)
    # class List(list):#继承类自己的list
    # def append(self,p_obiect):#自己定义一个类append,覆盖之前的功能
    # if type(p_obiect) is str:
    # List.append(self,p_obiect)#调用父类的append方式。
    # # super().append(p_obiect)#因为自己定义了append,但是使用此种super方法可以调用父类的append方法
    # else:
    # print("只能添加字符串")
    #
    # l1=list("hello word")
    # l1.append("ryui")
    # print(l1)

    #自己定义append可以直接覆盖,list类在继承之前的类


    #授权——————————以下内容

    #授权是包装的一个特性,包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品功能,其他它的则保持原样。授权的过程
    #即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性
    #授权实际也是包装,但是不用继承。实现授权的关键点就是覆盖__getattr__

  • 相关阅读:
    spring-boot4
    spring-boot3代码
    spring-boot3
    spring-boot2代码
    spring-boot2
    Java Socket编程
    eclipse项目中.classpath文件详解
    spring-boot1
    ASCII 在线转换器
    如何在Android开发中让你的代码更有效率
  • 原文地址:https://www.cnblogs.com/jianchixuexu/p/11710520.html
Copyright © 2011-2022 走看看