第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__

原文地址:https://www.cnblogs.com/jianchixuexu/p/11710520.html