day26:面向对象进阶:set、get、del反射和内置
三 __setattr__,__delattr__,__getattr__
__开头的都是内置的,不定义系统都会有。如果自己定义的话,就会覆盖系统内置的,执行自定义的部分(是否有完成设置的语法,有的话完成,没有就设置没成功,返回空字典)。可以通过dir(Foo)查看所有的内置属性。
用法:
三者的用法演示
class Foo:
x=1
def __init__(self,y):
self.y=y def __getattr__(self, item):
print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value):
print('----> from setattr')
# self.key=value #这就无限递归了,只要一出现设置值的操作,就会触发__init__函数,然后执行__setattr__.无限递归循环。
# self.__dict__[key]=value #应该使用它
def __delattr__(self, item):
print('----> from delattr')
# del self.item #无限递归了
self.__dict__.pop(item) #__setattr__添加/修改属性会触发它的执行 f1=Foo(10) print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值 f1.z=3 print(f1.__dict__) #__delattr__删除属性的时候会触发 f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作 del f1.a print(f1.__dict__) #__getattr__只有在使用点调用属性且属性不存在的时候才会触发 f1.xxxxxx
class Foo:
x=1
def __init__(self,y):
self.y=y def __setattr__(self, key, value):
print('__setattr__执行')
# self.key=value
self.__dict__[key]=value
f1=Foo(10)
print(f1.__dict__)
f1.z=2
print(f1.__dict__)
class Foo:
def __getattr__(self, item):
print('------------->') # print(Foo.__dict__)
print(dir(Foo))
f1=Foo() print(f1.x) #只有在属性不存在时,会自动触发__getattr__ del f1.x #删除属性时会触发_delattr__ f1.y=10
f1.x=3 # 设置属性的时候会触发——setattr———
利用__setattr__自定义把设置的属性都为字符串类型:
class Foo:
x=1
def __init__(self,y):
self.y=y def __setattr__(self, key, value):
print('__setattr__执行',key,value)
# self.key=value
if type(value) is str:
self.__dict__[key]=value.upper()#自定义全部转化为大写
else:
print('【%s】不是字符串类型' %value)
f1=Foo('alex')
print(f1.__dict__)
f1.z=2
print(f1.__dict__)
四 二次加工标准类型(包装)
包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工。
派生:继承原来的基本属性,并且派生出新的属性规则。
#利用继承派生来定制化函数
class List(list):
def append(self, p_object):
if type(p_object) is str: #定制只能添加为字符串的函数
#self.append(p_object) 无限死循环,解决方法调用父类
super().append(p_object)
else:
print('只能添加字符串')
def show_middle(self): #定制之获取中间的元素的函数。
i=int(len(self)/2)
return self[i-1] l1=List('helloworld')#没写实例化函数,继承list的实例化过程。
#相当于在执行:l2=list(hello world)
print(l1,type(l1))
print(l1)
l1.append('sd')
print(l1)
print(l1.show_middle())
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'] <class '__main__.List'>
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', 'sd']
o
答案
授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。
实现授权的关键点就是覆盖__getattr__方法
day26:面向对象进阶:set、get、del反射和内置的更多相关文章
- python 面向对象之反射及内置方法
面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静 ...
- 面向对象(五)——isinstance与issubclass、反射、内置方法
isinstance与issubclass.反射.内置方法 一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,cla ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- day26.面向对象-反射封装内置方法
封装 隐藏对象的属性和实现细节,近对外提供公共访问方式 广义:代码保护,面向对象思想 狭义:将属性,方法隐藏起来 class Person: __key = 123456 # 私有的静态属性 def ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
- Python之路(第二十五篇) 面向对象初级:反射、内置方法
[TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...
- 面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理
一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,class) 2.issubclass是用来判断一个类是否为另一个 ...
- 反射与内置方法str del
1.反射 用字符串来操作类或者对象的属性 class People:# country= 'china'# def __init__(self,name):# self.name= name## de ...
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
随机推荐
- nodejs入门 SSH服务器远程部署nodejs
最近刚刚接了一个项目我也是个nodejs的初级的人 从开始吧 建立服务器 用什么ssh工具我就不说了 这个界面大家都熟悉吧 点击下面的 All download options wget http: ...
- shell脚本入门及基本元素
命令和参数 #!/bin/sh 其中#!用来告诉系统它后面的参数是用来执行该文件的程序,必须放在脚本的首行,不然会在执行脚 本 的时候报错.当一个文件开头的两个字符是#!时,内核会扫描其它的部分看是否 ...
- 610K图纸打印新版增值税发票不完整的调整方法
新版增票页面设置增票向下0.8向右-10,10刻度进纸测试 向右调整可能会有些出入 根据情况微调即可.
- Memcache学习笔记
以下内容大部分来自网络,小部分是本人遇到的问题融合后的记录. 先贴一段涨姿势~ Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全 ...
- 【转】Native JavaScript Data-Binding
原文转自:http://www.sellarafaeli.com/blog/native_javascript_data_binding Two-way data-binding is such an ...
- iOS--UIView和UIWindow用法
基础 UI(user interface)是用户界面:iOS的应用是由各种各样的UI控件组成 UIWindow就是一个窗口,学的第一个基础类,就是一个容器,可以在容器上放不同的内容,每个app都需要借 ...
- nodevalue
在改变文本节点值时,使用DOM的nodeValue属性,用来得到和设置一个节点的值. 代码示例: html: <p id="description">choose a ...
- span标签设置margin-top没有效果
<span>是行内元素,span只有margin-left和margin-right才有效果.要想margin-top生效就要把span转给块级元素才行.在span的css中加入以下属性即 ...
- 行列式计算(C#)
最近几天学习高等代数老师说要写个程序算行列式的结果,闲来无事就简单写了一下. 不多说了,上代码 using System; using System.Collections.Generic; usin ...
- css background-size
先来看下语法:background-size: length|percentage|cover|contain;具体的值,百分比都ok,w3c上面说的很清楚,当时具体的值或者百分比的时候,第一个表示宽 ...