初学者python笔记(封装、反射、类内置attr属性、包装与授权)

2023-05-16

文章目录

        • 封装
        • 反射
        • 动态导入模块
        • 类内置attr属性
        • 包装与授权

本篇文章仍然是面向对象的相关内容,主要分析了封装、反射、动态导入模块、类内置attr属性、包装与授权三大面向对象编程的后续处理方法

封装

封装的本质:
把方法放到类里、把类放到模块里就叫装;

而其他地方导入模块、引用类、调用方法时看不到对应的模块、类、方法的具体逻辑,只知道名字就可以,因为它们是隐藏着的,这就叫封

封装的本质就要明确区分内外,因此封装是一种思想,内部就是内部,外部就是外部

class People:
    #以_开头的变量就是被隐藏的变量,外部使用它的时候就无法看到它
    _place= 'Beijing'
    __position= 'Python'
    def __init__(self,id_num,name,age,salary):
        self.id_num= id_num
        self.name= name
        self.age= age
        self.salary= salary

    def get_id(self):
        print('I am a privacy,我需要找的id为【%s】' %self.id_num)

#实例化
v1= People('12345678','Zoro',22,2000000)
print(v1._place)
#虽然被隐藏了,但是仍然可以调用它,隐藏只是一种约定,但python没有真正限制你去访问

#但是__开头的,就必须带上类名
#print(v1.__position)
print(v1._People__position

运行结果:
封装
真正效果上的封装: 明确区分内外,内部的实现逻辑,外部无法知道,并且为封装到内部的逻辑提供一个访问接口给外部使用

反射

反射的本质:
也叫做程序的自省,主要指程序可以访问、检测和修改它本身状态的一种能力

class BadGuy:
    feature= 'Ugly'  #特征是丑
    def __init__(self,name,address):  #两个参数,一个名字一个地址
        self.name = name
        self.address= address

    #动作(函数属性)
    def sell_house(self):
        print('【%s】 正在卖房子'%self.name)

    def rent_house(self):
        print('【%s】 正在租房子' %self.name)

#实例化
p1= BadGuy('黑中介','沙河')

#p1.sell_hourse()

#开始自我反省(反射)
print(hasattr(p1,'name'))  #对象中是否有name这个属性,返回值为布尔值
print(hasattr(p1,'sell_house'))
#hasattr()反射函数第一个参数为一个对象,第二个是字符串,相当于p1.name

print(getattr(p1,'name'))
#返回name这个属性对应的值(函数属性则返回函数内存地址),
#一参为对象,二参为字符串.若不存在,会报错
print(getattr(p1,'rent_house'))
#第三个参数为Default,表示若不存在则输出第三个参数
print(getattr(p1,'r_house','该属性不存在'))

setattr(p1,'新世界第五皇','路飞')  #在属性字典里新增一个键值对,也就是多一个属性
print(p1.__dict__)
#也可以增加函数属性
setattr(p1,'add_num',lambda x:x+1)  #自增1的匿名函数
setattr(p1,'join_str',lambda self:self.name+'是BadGuy')  #拼接字符串的匿名函数
print(p1.add_num(1313))  #调用函数
print(p1.join_str(p1))  #因为是以self为的匿名函数,所以传入的参数为对象名

delattr(p1,'新世界第五皇')  #删除属性字典里的键值对,一参为对象名,二参为键
print(p1.__dict__)

运行结果:
反射

动态导入模块

首先自定义一个简单的模块,放到web文件夹组成一个包:
自定义模块

#from web import test  #正常导入web包内的test自定义模块

#动态导入模块
module = __import__('web.test')  #导入相对路径下的web包内的test模块
print(module)  #其实导入的只是web包,整个module就代表了web,并没有test1
#这样操作才可以导入web下的test1
module.test.test1()  #导入并调用test1函数


#利用importlib模块来导入
import importlib
m = importlib.import_module('web.test')
print(m)  #与__module__不同,这里导入的就是test这个模块了
#因此可以直接调用
m.test2()  #就不用m.test.test2了

运行结果:
动态导入模块

类内置attr属性

总共有三大类内置attr属性:
getattr
setattr
delattr

class Test:
    y = 2020
    def __init__(self,x):
        self.x= x

    def __getattr__(self,item):  #item为必须参数
        print('正在执行__getattr__方法')

    def __delattr__(self,item):
        print('正在触发__delattr__操作')

    def __setattr__(self,key,value):  #设置值的时候是加入属性字典里,所以传入的是键值对
        print('正在用__setattr__设置值')
        #__setattr__内必须有设置值的操作
        self.__dict__[key]= value  #设置原属性字典

#实例化
p1= Test(520)

#__getattr__方法
print(p1.x)  #用属性字典来获取属性
print(getattr(p1,'__getattr__'))  #用getattr函数来获取属性
p1.jjjjjjjjjjjjjjjjjj  #一个不存在的属性名,就会触发__getattr__方法的执行

#__delatrr__方法
del p1.y  #当执行del操作时就会触发__delattr__方法的执行
#p1.__dict__.pop('x')  #这种方法不会触发__delattr__的执行


#__setattr__方法,当设置值的生活就会触发
print(p1.__dict__)  #输出原属性字典
p1.y= 13  #又设置两个新的键值对,就会执行两次__setattr__
p1.z= 14
print(p1.__dict__)

运行结果:
类内置attr属性
__getattr__的好处:
当传入不存在的属性时不会报错,而是输出对应的提醒

class Test:
    y = 2020
    def __init__(self,x):
        self.x= x

    def __getattr__(self,item):  #item为必须参数
        print('你找的属性【%s】不存在!' %item)  #此时的item就是调用时传入的属性


#实例化
p1= Test(520)

#__getattr__方法
print(p1.x)  #用属性字典来获取属性
print(getattr(p1,'__getattr__'))  #用getattr函数来获取属性
p1.jjjjjjjjjjjjjjjjjj  #一个不存在的属性名,就会触发__getattr__方法的执行

运行结果:
__getattr__的好处

包装与授权

包装: 包装一个类型通常是对已经存在的类型进行一些定制,可以新建、修改、删除原有产品的功能,其他的保持原样

授权: 授权是包装的一个特性,所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性;实现授权的关键点就是覆盖__getattr__方法

import time  #导入时间模块

class Open:  #产生一个文件的类
    def __init__(self,filename,mode,encoding):
        #self.filename= filename
        #打开一个文件并设为self.file属性
        self.file= open(filename,mode,encoding=encoding)
        self.mode= mode
        self.encoding= encoding

    #一个中转站
    def __getattr__(self,item):
        print('【%s】不存在!' %item)
        print(item,type(item))  #输出传入值和它的类型

        #授权的实现
        return getattr(self.file, item)
        #获取self.file中的信息,不存在就会新建一个,并返回新建方法的内存地址

    #覆盖__getattr__方法,即自定义一个write的方法,就表示已经存在了write方法,
    #所以不会触发__getattr__方法去新建一个write方法
    def write(self,line):  #第二个参数是传入的写的内容
        t = time.strftime('%Y-%m-%d %t')  #字符格式化显示系统时间,年-月-日
        self.file.write(t + line)  #字符串拼接

#实例化及调用
p1= Open('a.txt','r+','gbk')
print(p1.file)  #输出file的信息

p1.read  #触发__getattr__,运行getattr()方法
#新建了一个item的方法,就可以调用到了
print(p1.write)  #再次触发__getattr__,使其新建一个write的方法

#就可以实现写的操作了
p1.write('Is ok...\n')
p1.write('终于可以写进来了\n')

p1.file.close()  #关闭文件,实现数据的更新

运行结果:
包装与授权
在文件中也正常写入了内容:
授权

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初学者python笔记(封装、反射、类内置attr属性、包装与授权) 的相关文章

  • 解决电脑80端口被占用问题!亲测有用!!!

    方法1 xff1a 1 在桌面 xff0c 按下 WINDOW 43 R 快捷键 2 在弹出的命令行窗口下执行下面的命令 xff1a cmd xff0c 点击确定 3 输入net stop http xff0c 点击确定 xff0c 再次输
  • linux 下 常见 知识点

    1 etc resolv conf ping通baidu com DNS 域名解析服务器 xff01 该文件是DNS域名解析的配置文件 xff0c 它的格式很简单 xff0c 每行以一个关键字开头 xff0c 后接配置参数 resolv c
  • 学习51单片机经历

    学习51单片机的记录 文章目录 前言一 所使用的软硬件设备二 学习课程三 学习内容1 软件安装2 单片机基础3 真正开始学习 xff08 一 xff09 LED灯 总结修改日志 前言 提示 xff1a 只是记载本人学习51单片机的经历 xf
  • LED灯系列

    LED灯系列 本系列为stc89c52RC单片机开发板上LED灯相关操作思路和代码 点此链接转到专栏目录链接 http t csdn cn skf2j 文章目录 LED灯系列1 xff09 原理2 xff09 单个LED灯常亮3 xff09
  • Angular CLI的安装报错

    一 安装步骤 angular cli它是angular框架官方的一个构建工具 xff0c 当你使用 ng new xxx 项目名 创建一个项目时 xff0c 会自动生成项目结构 Angular CLI用于简单 xff0c 快速构建Angul
  • 最新Anaconda3的安装配置及使用教程

    安装记录参考链接 出现问题 xff1a 镜像地址无效 不知道 设置Anaconda镜像 那一步我哪里没有操作好 答 步骤错了 正确步骤 xff1a 1 先执行 conda config set show channel urls yes 生
  • Linux 环境变量:DISPLAY

    1 dbvis no x11 display variable was set but this program performed an operation which requires it solution export DISPLA
  • PostgreSQL入门-安装与基本使用(Ubuntu)

    PostgreSQL入门 安装与基本使用 xff08 Ubuntu xff09 PostgreSQL 是一个免费的对象 关系数据库服务器 ORDBMS xff0c 号称是 世界上最先进的开源关系型数据库 PostgreSQL 是以加州大学计
  • windows下的pycharm项目部署同步到Linux下的pycharm开发

    windows下的pycharm项目部署同步到Linux下的pycharm开发 一 运行平台二 SSH连接远程服务器 一 运行平台 项目部署系统 xff1a UOS 项目开发平台 xff1a windows10 IDE xff1a PyCh
  • redhat操作系统升级红帽6升级到红帽7linux升级

    本文档介绍了从 RHEL 6 到 RHEL 7 就地升级的步骤 支持的就地升级路径是从 RHEL 6 10 到 RHEL 7 9 如果您的 RHEL 系统满足以下条件 xff0c 则完全支持此 RHEL 6 到 RHEL 7 升级过程 xf
  • Kubernetes角色访问控制RBAC和权限规则(Role+ClusterRole)---好文

    基于角色的访问控制 xff08 Role Based Access Control 即 RBAC xff09 使用 rbac authorization k8s io API Group实现授权决策 xff0c 允许管理员通过Kuberne
  • 你知道abrt-hook-ccpp吗

    1 什么是abrt hook ccpp abrt也可以叫abrtd xff0c 展开应该是automatically bug report daemon xff0c 也就是自动错误报告守护进程 从字面意义就可以看出 xff0c 他是一个守护
  • Mobaxterm 使用图形界面

    redhat 7 yum install firefox xorg x11 xauth mesa libGLES devel x86 64 mesa dri drivers vi etc ssh sshd config X11Forward
  • Linux ❉ Chronyd时间同步服务器详解

    一 介绍 1 简介 集群中节点之间需要时间同步 xff0c Chronyd不依赖外部的时间服务NTP xff0c 在内部搭建时间服务器 Chrony是网络时间协议 xff08 NTP xff09 的一种实现 xff0c 是一个类Unix系统
  • Linux时间延迟平滑对时方案的分析-Ntp和Chrony的不同表现

    系列文章目录 文章目录 系列文章目录前言一 环境信息二 ntpd模式 2 1 版本信息2 2 配置ntpd对时源 2 2 1 配置ntpd服务配置 xff0c 启动ntpd服务2 3 2 查看对时情况2 3 配置ntpd客户端 2 3 1
  • keepalive实现MGR的自动切换(二)

    10 0 0 7 lemon 10 0 0 8 lemon2 10 0 0 9 lemon3 程序代码里只需写一个VIP连接数据库即可 xff0c 后面是连接在哪一台通过 xff0c keepalived的在服务端实现 xff1b 通过检测
  • mysql MGR配置keepalived

    之前写过一篇mysql8 0搭建MGR 在这里 mysql8 0配置MGR 悠游 博客园 cnblogs com 在此基础上配置keepalived 一 安装keepalived 可能会少些包 xff0c 所以配置了网络yum源 所有节点均
  • UltraVNC 使用方法详细说明

    每次修改uvnc settings exe后 xff0c 都要重启Winvnc或者VNC server的进程 配置 否则会如下图 结束Winvnc进程 重新打开winvnc exe 直接点OK 打开UVNC Launch exe 右键SER
  • Linux(Ubuntu)下升级Nginx服务器软件至nginx-1.17.6

    Linux下升级Nginx服务器软件nginx 1 17 6 Nginx 音engine X 是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器 也是一个 IMAP POP3 SMTP 代理服务器
  • 通过SnmpWalk获取服务器状态信息

    简单网络管理协议SNMP xff08 Simple Network Management Protocol xff09 是网络监控和网络设备管理的统一 协议 xff0c 并被所有主流的操作系统和大量网络应用程序所支持 SNMP广泛用于管理和

随机推荐