当前位置: 首页 > 编程日记 > 正文

第二十五章 面向对象------封装、内置函数、反射、动态导入

1、封装

什么是封装?

  1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口

    注意:封装有隐藏的意思,但不是单纯的隐藏

    学习封装的目的:就是为了能够限制外界对内部数据的访问

  python中属性的权限分为两种:

  1.公开的

    没有任何限制,谁都可以访问

  2.私有的

    只有当前类本身能狗访问

  默认为公共的

为什么要封装?

  1.提高安全性

    封装属性

  2.隔离复杂度

    封装方法

  一个类中分为两种数据:属性和方法

封装属性

class Student:

def __init__(self,name,age,gender,id_card):
self.name = name
self.age = age
self.gender = gender
self.__id_card = id_card

def show_id_card(self):
 可以在这里添加额外的任何逻辑代码 来限制外部的访问

在类的内部 可以访问
print(self.__id_card)

对私有属性的访问以及修改

class Student:
def __init__(self,name,age,gender,id_card):
self.name = name
self.age = age
self.gender = gender
self.__id_card = id_card

 访问被封装的属性 称之为访问器
def get_id_card(self,pwd):
 可以在这里添加额外的任何逻辑代码 来限制外部的访问
 在类的内部 可以访问
if pwd =="123":
return self.__id_card
raise Exception("密码错误!")


 修改被封装的属性 称之为设置器
def set_id_crad(self,new_id):
 身份证必须是字符串类型
 长度必须是18位
if isinstance(new_id,str) and len(new_id) == 18:
self.__id_card = new_id
else:
raise Exception("身份证号码 必须是字符串 且长度必须为18!")

什么样的方法应该被封装起来?

  一个为内部提供支持的方法,不应该让外界直接访问,那就封装起来,如下例中的  user_auth

class ATM:

  def withdraw(self):

    self.__user_auth()

    self.__input_money()

    self.__save_record()

    # 输入账号和密码
    # 显示余额
    # 输入取款金额
    # 保存记录

  def __user_auth(self):

    print('请输入账号密码...')

  def __input_money(self):

    print('余额为1000000000,请输入取款金额!')

  def __save_record(self):

    print('记录流水......')

封装原理:

python是通过 变形的方式来实现的封装
如何变形 在名称带有双下划线开头的变量名字前添加_类名 如_Person__id_card
当然通过变形后的名字可以直接访问被隐藏的属性 但通过不应该这么做
变形仅在类的定义阶段发生一次 后续再添加的带有双下划线的任何属性都不会变形 就是普通属性

什么时候用?

封装属性:

  当这个对象存在一个机密性的属性,例:身份证信息,银行卡密码等,这样属性不应该被外界直接访问到时就将其封装。

封装方法:

  一个为内部提供支持的方法,不应该让外界直接访问,那就将其封装。

Prorety

作用:将一个方法伪装成普通属性;用property是为了希望将访问私有属性和普通属性的方式变得一致。

与Prorety相关的两个装饰器:

setter:用 . (点)语法给属性赋值是触发

deleter:用 . (点)语法删除属性时触发

例:

calss Teacher:

  def __init__(self,name,age.salary):

    self.name=name

    self.age=age

    self.__salary=salary

  @property  # getter   # 用于访问私有属性的值   也可以访问普通属性

  def salary(self):

    return self.__salary

  @salary.setter  # 用来设置私有属性的值  也可以设置普通属性

  def salary(self):

    self.__salary=new_salary

  @salary.deleter   # 用来设置私有属性的值  也可以删除普通属性

    # print("can not delete salary!")

    del  self.__dict__['Teacher__salary']

Property 计算属性使用场景:

什么是计算属性:

  一个属性它的值不是固定死的,而是通过计算动态产生的。

class Person:

  def __inin__(self,name,height,weight):

    self.name=name

    self.height=height

    self.weight=weight

  @aproperty

  def  BMI(self):

     return sdlf.weight/(self.height**2)

  @setter

  def  BMI(self,new_BMI):

    print('BMI 不支持自定义......')

p=person('egon',1.7,80)

print(p.BMI)

P.BMI=10

多态: 多态不是一个具体的技术或代码,指的是,多个不同类型对象,可以响应同一个方法,产生不同结果

使用多态的好处:

  只需要学习积累中的使用方法即可,不需要关心具体的哪一个类,实现  

   以不变应万变  提高灵活性  提高扩展性

  如果没有多态,需要分别学习 person cat pig 的不同使用方法,这对于使用者而言太麻烦了

  鸭子类型:就是典型的多态,多重不同类型 使用方法一样

案例:

class Cat():
  def bark(self):
    print("喵喵喵")
  def run(self):
    print("四条腿跑!")
  def sleep(self):
    print("趴着睡!")

class Pig():
  def bark(self):
    print("哼哼哼!")
  def run(self):
    print("四条腿跑!")
  def sleep(self):
    print("侧躺着睡!")

# 一个用来管理动物的方法 只要你传入是一个动物 我就按照动物的标准来使用 完全不用考虑你具体是什么类型
def management_animal(animal):
  print("==================正在溜%s=============" % animal.__class__.__name__)
animal.bark()
animal.run()
animal.sleep()

常用的内置函数

__str__

对象转成字符串是被强制执行

__del__

__del__:当对象被删除前会自动调用 ,该方法声明时候会删除对象?

    1.程序运行结束,解释器退出,将自动删除所有数据

    2.手动调用del 时也会删除对象

    注意:该函数不是用来删除对象的

使用场景:

  当你的对象在创建时,开启了不属于解释器的资源,例如打开一个文件必须保证对象被删除时,

同时关闭额外的资源,如文件。

__del__也称之为析构函数,析构,构造的反义词

  构造:值得是从无到有

  析构:至从有到无

  简单的说就对象所有数据全部删除

总结:__del__该函数,用于在对象删除前做一些清理操作

class Person:
  def __init__(self,name,path,mode="rt",encoding="utf-8"):
    self.name = name
    self.file = open(path,mode,encoding=encoding)

 

# 读取数据的方法
def read_data(self):
  return self.file.read()


def __del__(self):
  print("del run!")
  self.file.close()

反射(英文中叫反省,自省)

  面向对象中的反省值的是,一个对象必须具备,发现自身属性,以及修改自身属性的能力

  一个对象在设计初期,可能考虑不够周全后期需要删除或修改已经存在的属性,和增加属性

反射就是通过字符串来操作对象属性

涉及到方法:

hasattr 判断是否存在某个属性

getattr 获取某个属性的值

setattr 新增或修改某个属性

delattr 删除某个属性

案例:

class MY_CMD:

   def dir(self):
       os.system("dir")

   def ipconfig(self):
       os.system("ipconfig")

cmd = MY_CMD()

while True:
   name = input("请输入要执行的功能:")
   if hasattr(cmd,name):
       method = getattr(cmd,name)
       print(method)
       method()
   else:
       print("sorry this method is not exists....!")

动态导入模块

直接写import 称之为静态导入 建立在一个基础上:提前已经知道有这个模块
动态导入 指的是 在需要的任何时候 通过指定字符串类型的包名称来导入需要的模块
import importlib
mk = importlib.import_module(m_name)
mk 即导入成功的模块
"""
该方式常用在框架中 因为框架设计者不可能提前预知后续需要的模块和类

  

转载于:https://www.cnblogs.com/sry622/p/10896914.html

相关文章:

STL vector list deque区别与实现

1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间…

pigeon 介绍

https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一。 主要特色 除了支持spring schema等配置方式,也支持代码annotati…

docker 安装使用 mysql

1、下载mysql镜像 docker pull mysql:5.7 2、运行mysql docker run --name my_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDXYBB_1314 -d mysql:5.7 参考: https://blog.csdn.net/jiangyu1013/article/details/79958410 https://www.cnblogs.com/limingxie/p/…

国内第一部IT治理综合图书问世

国内第一部全面阐述企业IT治理理念与实践的图书《中国企业的IT治理之道》于2010年3月由清华大学出版社正式出版发行。对国内的企业来说,IT治理并不是一个陌生的词汇。对于什么是IT治理?什么样的治理才是最优的?如何构建最适合企业的IT治理机构…

oracle终止用户会话

1.创建两个测试用户进行实验 执行命令如下: create user test1 identified by 1; create user test2 identified by 1; grant dba to test1; grant dba to test2; 如下图,我创建了两个用户,并授予两个用户dba角色。 2,windows下使用cmd连接or…

正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码......

当我在窗体初始化的时候,调用了一个外部的dill时,它就不知什么原因的 抛出一个“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”的异常,程序就卡掉了,在网上查了查,相关说明如下:.NET2.0中增加…

Nginx在windows下常用命令

cmd 进入Nginx解压目录 执行以下命令 start nginx : 启动nginx服务 nginx -s reload :修改配置后重新加载生效 nginx -s reopen :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试nginx配置文件是否正确--------------------- 验证配置是否正确: n…

微信小程序使用npm 进行下载构建组价

1、进入小程序根目录 构建前微信小程序目录 使用npm 初始化命令进行初始化小程序目录 npm init -y 构建后的目录为 构建完成后 如何进行使用 {"usingComponents": {"van-notice-bar": "/miniprogram_npm/vant-weapp/notice-bar/index"} }如果提…

CorelDRAW快捷键搜集

02. 将CorelDRAW中的标准工具列除去,标准工具列比鸡肋还无味,除去可增大可视面积.03. CorelDARW 9 的段落文字并非不能转成曲线,方法并不止一种,可到Google搜索相关方法.04. 熟练使用CorelDARW 9 中的F2/F3/F4 比按放大镜爽又能节约相当多的时间05. CorelDARW 9 中Altaa是个相当…

spring cloud微服务治理eureka、hystrix、zuul代码例子

spring cloud微服务中台服务代码例子,包括eureka、hystrix、zuul https://github.com/birdstudiocn/spring-cloud-sample/tree/master转载于:https://www.cnblogs.com/birdstudio/p/10899923.html

CentOS7种搭建FTP服务器

1.安装vsftpd #首先要查看你是否安装vsftp [rootlocalhost /]# rpm -q vsftpd vsftpd-3.0.2-10.el7.x86_64 (显示也就安装成功了!) #如果没有则安装vsftpd [rootlocalhost/]# yum install -y vsftpd #完成后再检查一…

ssm 实现房屋租赁系统

目录 1、系统功能 2、系统使用技术 3、系统截图 4、代码截图 5、下载地址:https://download.csdn.net/download/huyande123/14039462 1、系统功能 该系统有两类用户 管理员以及普通用户,普通用户注册、用户登录退出、房源信息增删改查、租赁合同信…

成长之第一次面试

遥远地记得,近两年前的第一次面试. 虽然并不愉快,但是,往往第一次,总让人印象深刻. 我记得当时是ebay来学校招聘,兴致勃勃地跑去参加了笔试,本以为自己直接酱油的,结果竟然很幸运地通过了笔试. 还记得笔试是全英文的吧,自己的英语从进入大学开始,就有够烂的,但还是很幸运的进入…

配置GRE隧道

一、拓扑图:二、配置及说明:1、配置三台路由器的IP地址。并且在R1和R3配置默认路由,确保广域网链路能够通信:R1(config-line)#int s1/1R1(config-if)#no shR1(config-if)#ip add 202.101.172.37 255.255.255.252R1(config-if)#int…

【案例】城市地址三级联动

注意点&#xff1a; 1、<option value""></option> value值的设置 2、select的onchange事件 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>城市地址三级联动</title&…

python 更新pip 失败问题总结

1、报pip 8.1.1 Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr Successfully installed pip-8.1.1 You are using pip version 8.1.1, however version 19.1.1 is available. 如下 sudo pip install --upgrade pip The directory /ho…

[转]关于MyEclipse下的项目无法使用BASE64Encoder问题的解决办法

【链接】 http://blog.csdn.net/longlonglongchaoshen/article/details/75087616转载于:https://www.cnblogs.com/eager/p/8202900.html

携号转网:欢迎比阻挠更为有效

千呼万唤之后&#xff0c;携号转网已经在天津和海南两个试点地区“成功”实施。就在全国其他各地老百姓也翘首以待希望能“自由携号、自主转网”之时&#xff0c;见诸于报端的却都是运营商阻碍用户转网的种种“手段”&#xff0c;甚至大打出手、阴招不断&#xff0c;给携号转网…

一些大数库简介

为了解决大数运算的问题&#xff0c;世界各国的软件开发人员和研究学者都进行了很多的研究和实践。近年来&#xff0c;越来越多的开发人员开始重视软件工程的作用&#xff0c;为了减少重复劳动&#xff0c;提高软件的质量和代码复用&#xff0c;许多优秀的大数运算库随之出现。…

Silverlight技术支持谷歌Android

[计世网消息](刘清河 编译) 当苹果公司没有将Adobe公司的Flash技术集成到iPhone时&#xff0c;就好象已经为其竞争对手微软公司的Silverlight技术提供了一个可乘之机。然而&#xff0c;从目前出现的情况来看&#xff0c;无论是苹果公司还是微软公司&#xff0c;似乎都不可能与i…

生活中的一些事情

从小到大&#xff0c;在遭遇困境的时候&#xff0c;总想着有人能来帮我&#xff0c;自己也曾隐晦地向同学朋友家人发出求救信息&#xff0c;总觉得有人能帮我出谋划策&#xff0c;抑或是安慰我引导我&#xff0c;帮助我走出困境&#xff0c;然而始终是什么都没有。 也就突然真正…

python 使用安装虚拟环境 virtualenv

目录 1、安装virtualenv 2、Ubuntu使用python3创建虚拟环境目录 3、激活虚拟环境 4、关闭虚拟环境 5、查看python版本 1、安装virtualenv pip install virtualenv virtualenvwrapper 2、Ubuntu使用python3创建虚拟环境目录 virtualenv -p /usr/bin/python3 test3、激…

idea 启动时报 error:java 无效的源发行版

说白了就是编译的版本不符合&#xff0c;有的地方是jdk1.7 有的地方是jdk1.8 所以你只要每个地方都保持一致就行。 每个地方&#xff01;&#xff01; 每个地方&#xff01;&#xff01; 每个地方&#xff01;&#xff01; 重要的设置说三遍&#xff01; 以jdk1.7为例 file -- …

解决win7不能上网的问题

装了WIN7发现网通客户端无法登录了。真的让人郁闷&#xff0c;下面就说说怎样解决吧一、网通给你在客户端上使用的用户名其实不是真实的用户名&#xff0c;你可以使用如下方法获得真实的用户名。用网通客户端登录上网后&#xff0c;打开ie浏览器&#xff0c;在工具栏上点“inte…

spring中实现自己的初始化逻辑

实现这两个listener都可以进行自己的初始化逻辑。 InitializingBean.afterPropertiesSet 这个优先调用 ApplicationListener.onApplicationEvent 这个后调用他们分别由 AbstractApplicationContext.refresh 方法 调用的如下两个函数调用到的&#xff1a; finishBeanFactoryInit…

java-错误log4j:WARN No appenders could be found for logger

使用环境: 1.IED工具 idea 2.系统环境win10 错误原因: 1.根本原因是日志问题 解决方式: 1.pom文件添加jar包 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.2</version><…

理解委托(delegate)及为什么要使用委托

委托&#xff1a;是一种定义方法签名的类型。 当实例化委托时&#xff0c;您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。 上述为官方说法&#xff0c;理解起来比较难&#xff0c;举个生活中的例子&#xff1a; 某人有三子&#xff0c;让他们各…

echarts X轴 或者 Y轴 添加标识线

1、X轴添加标示线效果图 代码 option {xAxis: {data : [aaa,bbb]},yAxis: {},series: [{symbolSize: 20,data: [[aaa, 8.04],[bbb, 9.04],],type: line,markLine: {symbol: [none, none],//去掉箭头itemStyle: {normal: { lineStyle: {type: solid,color:{//设置渐变type: li…

OSPF配置实验

拓扑中设备&#xff1a;R1,R2,R3,SW F0/1 R1 F0/0,F0/2 R2 f0/0,F0/3 R3 F0/0R1配置基本配置IP环回OSPFR1(config)#int loop 0R1(config-if)#ip add 1.1.1.1 255.255.255.255R1(config)#router ospf 100//R1(config-router)#router-id 1.1.1.1R1(config-router)#net 192.…

CreateRemoteThread

CreateRemoteThread是一个Windows API函数&#xff0c;它能够创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).。转载于:https://www.cnblogs.com/hshy/p/10903581.html