封装与多态的基本使用

  • 1 > 派生的实际应用
  • 2 > 面向对象之封装
  • 3 > property
  • 4 > 面向对象之多态
    • 4.1 > 鸭子类型
  • 5 > 面向对象之反射
    • 5.1 > 反射实际案例

1 > 派生的实际应用

  当我们想要将一字典内的时间数据编写出jsong格式,但是json不支持序列化时间数据,通常有一种简单粗暴的方式就是直接将时间格式数据改成字符串类型,但这种方式体现不出我们程序的NB之处,我们就可以用派生来修改json源码中的default方法来实现:

import datetime
import jsonclass MyJsonEncoder(json.JSONEncoder):def default(self,o):# 形参o是即将要被序列化的数据对象if isinstance(o,datetime.datetime):return o.strftime('%Y-%m-%d %X')elif isinstance(o, datetime.date):return o.strftime('%Y-%m-%d')return super().default(o)
d1 = {'t1': datetime.datetime.today(), 't2':datetime.date.today()}
res = json.dumps(d1, cls=MyJsonEncoder)
print(res)

2 > 面向对象之封装

  封装的含义就是将类中的某些名字 ‘隐藏’ 起来,不让外界直接去掉用。隐藏的目的就是为了提供专门的通道去访问,在通道内可以添加额外的功能。
  封装方式是在变量名的前面加上两个下划线 _ _ 。封装的功能只在类的定义阶段才能生效!!! 在类中封装其实也不是绝对的 仅仅是做了语法上的变形而已

__变量名          >>>   _类名__变量名

  代码操作如下:


class Student(object):school = '清华大学'__label = '漂亮妹妹多'# 由于python崇尚自由 所以并没有真正的隐藏  而是自动转换成了特定的语法def __init__(self, name, age):self.name = nameself.age = agedef choose_course(self):print('%s正在选课'%self.name)

  当我们向获取name, age, school 的时候可以直接用对象加. 的方式获取,但是如果想要获取label的话具体操作如下:


stu1 = Student('bob', 18)
print(stu1.school)                  # 清华大学
print(stu1.name)                    # bob
print(stu1.age)                     # 18
# 获取__label的方式不同
print(Student._Student__lable)      # 漂亮妹妹多

  我们虽然指定了封装的内部变形语法 但是也不能直接去访问,当看到存在封装的属性时,我们需要通过特定的通道(接口)去访问。操作如下:


class Student(object):__school = '清华大学'def __init__(self, name, age):self.__name = nameself.__age = age# 专门开设一个访问学生数据的通道(接口)def check_info(self):print("""学生姓名:%s学生年龄:%s""" % (self.__name, self.__age))stu1 = Student('bob', 18)
stu1.check_info()              # 学生姓名:bob     学生年龄:18
stu1.set_info('kevin',28)
stu1.check_info()              # 学生姓名:kevin     学生年龄:28

  甚至我们还可以去加上一些限制:


class Student(object):__school = '清华大学'def __init__(self, name, age):self.__name = nameself.__age = age# 专门开设一个访问学生数据的通道(接口)def check_info(self):print("""学生姓名:%s学生年龄:%s""" % (self.__name, self.__age))    # 专门开设一个修改学生数据的通道(接口)def set_info(self,name,age):if len(name) == 0:print('用户名不能为空')returnif not isinstance(age,int):print('年龄必须是数字')returnself.__name = nameself.__age = age

3 > property

   property就是将方法伪装成数据
  有时候很多数据需要经过计算才可以获得,但是这些数据给我们的感觉应该属于数据而不是功能,例如计算BMI指数的操作,其中BMI指数应该属于人的数据而不是人的功能。具体操作如下:

class Person(object):def __init__(self, name, height, weight):self.__name = nameself.height = heightself.weight = weight@propertydef BMI(self): return '%s的BMI指数是:%s' % (self.__name, self.weight / (self.height ** 2))

   这样我们就可以进行传入人的数据去进行BIM指数的计算:


p1 = Person('jason', 1.83, 77)
print(p1.BMI)               # jason的BMI指数是: 22.9
p2 = Person('bob', 1.68, 66)
print(p2.BMI)               # bob的BMI指数是:23.3

4 > 面向对象之多态

   多态性的好处在于增强了程序的灵活性和可扩展性,比如通过继承Animal类创建了一个新的类,实例化得到的对象obj,可以使用相同的方式使用obj.speak()。


class Animal(object):def speak(self):pass
class Cat(Animal):def speak(self):print('喵喵喵')class Dog(Animal):def speak(self):print('汪汪汪')
class Pig(Animal):def speak(self):print('哼哼哼'

   因为这些都是动物并且他们的形态类似,所有我们在使用类似的方法时最好给他们定义一个统一的方法名。这一规则其实是需要程序员自己去遵守的,但是也提供了强制性的措施来实现多态性,当然我们不推荐使用,代码如下:

import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):@abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法def talk(self): # 抽象方法中无需实现具体的功能pass
class Person(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准def talk(self):pass# 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化

4.1 > 鸭子类型

   我们可以通过多态性推到出一个类型 —— 鸭子类型。实战案例如下:
   我们在不考虑对象是谁的情况下想要得到内存或者硬盘对象数据,我们若想读取数据就调用read 像写入数据就调用write


class Memory(object):def read(self):passdef write(self):pass
class Disk(object):def read(self):passdef write(self):pass

5 > 面向对象之反射

   反射的意思就是通过字符串来操作对象的数据和功能,具体的方法有4种 —— hasattr()、getattr()、setattr() 、delattr()。
  hasattr(),判断对象是否含有字符串对应的数据或者功能
  getattr():根据字符串获取对应的变量名或者函数名
  setattr():根据字符串给对象设置键值对(名称空间中的名字)
  delattr():根据字符串删除对象对应的键值对(名称空间中的名字)

class Student(object):school = '清华大学'def get(self):pass
obj = Student()
# 当我们想查找Student名称空间当作是否含有用户指定的名字或函数名
print(hasattr(Student, 'school'))       # True
print(hasattr(Student, 'get'))  # True
print(hasattr(Student, 'post'))  # False# 当我们想获取Student类当中的属性或者方法的值时
print(getattr(Student, 'school'))  # 清华大学
print(getattr(Student, 'get'))     #  <function Student.get at 0x10527a8c8># 当我们想给对象添加键值对时
setattr(obj, '学号', 181040248)
print(obj.__dict__)         # {'学号': 181040248}# 当想删除时
delattr(obj, '学号')
print(obj.__dict__)       {}

5.1 > 反射实际案例


import settings
dir(settings)  # 获取对象中所有可以使用的名字
getattr(settings, 'NAME')
class FtpServer:def serve_forever(self):while True:inp=input('input your cmd>>: ').strip()cmd,file=inp.split()if hasattr(self,cmd): # 根据用户输入的cmd,判断对象self有无对应的方法属性func=getattr(self,cmd) # 根据字符串cmd,获取对象self对应的方法属性func(file)def get(self,file):print('Downloading %s...' %file)def put(self,file):print('Uploading %s...' %file)obj = FtpServer()
obj.serve_forever()

封装与多态的基本使用相关推荐

  1. Java继承_Hachi君浅聊Java三大特性之 封装 继承 多态

    Hello,大家好~我是你们的Hachi君,一个来自某学院的资深java小白.最近利用暑假的时间,修得满腔java语言学习心得.今天小宇宙终于要爆发了,决定在知乎上来一场根本停不下来的Hachi君个人 ...

  2. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)

    面向对象的三大特征: 封装,继承,多态 面向对象的编程思想核心:高类聚,低耦合–程序的设计模式范畴 封装 什么是封装: 在面向对象编程的思想中,对代码进行高度封装,封装又叫包装 封装就是指将数据或者函 ...

  3. 封装,多态,类的约束,super()深入了解

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  4. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  5. 一文带你了解java面向对象的三大特性:继承、封装、多态

    文章目录 1.继承 2.封装 3.多态 本篇文章以同步到:https://www.bithachi.cn/posts/c72fe2cc.html 1.继承 继承是类与类的一种关系,子类拥有父类的所有( ...

  6. 对C++继承,封装,多态的理解

    用了C++一段时间,感觉对C++慢慢有了一点认识,在这和大家分享一下. C++是一款面向对象的语言,拥有面向对象语言的三大核心特性:继承,封装,多态.每一个特性的良好理解与使用都会为我们的编程带来莫大 ...

  7. C语言和设计模式(继承、封装、多态)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言.C++有三 ...

  8. 对象、继承、封装、多态、抽象类的组合应用:编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个Employee对象的生日,则将在该雇员的工资上增加100元发给他。

    实验题目: 编写工资系统,实现不同类型员工(多态)的按月发放工资.如果当月出现某个Employee对象的生日,则将在该雇员的工资上增加100元发给他. 实验目的: 对象.继承.封装.多态.抽象类的组合 ...

  9. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  10. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

最新文章

  1. 本科计算机专业考北大软微,2022北京大学软微学院计算机智能科技考研必看经验指导(含复试解析)...
  2. Android_TextSwitcher和ImageSwitcher
  3. NIO详解(十二):AsynchronousFileChannel详解
  4. mate10的html5跑分,麒麟970逆天!华为Mate10跑分首曝:媲美骁龙835
  5. 【版本更新】网易云信IM微信小程序上线啦!
  6. javascript犀牛书_犀牛书作者:最该忘记的JavaScript特性
  7. 整理了Kafka的一些常用工具,建议收藏备用!| 博文精选
  8. PAT甲题题解-1106. Lowest Price in Supply Chain (25)-(dfs计算树的最小层数)
  9. Part 2 —— 迁移到 Go Modules
  10. python字符串转换为数字_Python不使用int()函数把字符串转换为数字的方法
  11. VBA写入公式(4):数字转大写金额公式
  12. txt文件内容导入mysql数据库中_将txt文件导入mysql数据库
  13. 银河麒麟高级服务器操作系统V10上.NET Core与Java相同类型MySQL(MariaDB) WebApi简单性能对比
  14. 面向不平衡数据的电子病历自动分类研究
  15. nod32系统更新服务器,Nod32官方升级服务器列表
  16. Solidity动态数组汇编开发教程
  17. 无需越狱,iPhone修改微信提示音!
  18. 广州集体户口办理未婚证流程
  19. Django的视图函数(二):request对象、视图函数返回值(HTML响应、JsonResponse)、反向解析(视图函数)、HttpResponse子类
  20. 移动端excel导出_Excel格式的手机端和电脑端转换方法,一键就可以实现,不知可惜...

热门文章

  1. python进行文本分类,基于word2vec,sklearn-svm对微博垃圾评论分类
  2. linux作服务器的论文,基于Linux下的各种服务器技术及配置.rar
  3. 时刻表的选择php代码,基于php的火车时刻表接口调用代码实例
  4. 列一下中国食品工程方面最有含金量的5个证书
  5. python求列表的峰度系数
  6. 关于height:100vh和height:100%的区别
  7. PS安装教程,附地址
  8. 微信小程序 为input绑定回车事件
  9. python如何连接创建我的世界_快来用Python写一个简单版《我的世界》
  10. resnet18实现猫狗图片的分类