python面向对象的特征及反射
目录
派生类实操
面向对象特征之封装
property伪装属性(python内置装饰器)
面向对象特征之多态
面向对象之反射
派生类实操
1.将时间字典序列化成json格式,由于序列化数据类型的要求,时间类型不属于json格式序列化的数据类型:
json函数中参数cls = JSONEncoder(是个类)
类中影响数据类型的方法是def default(self, o)
用派生方法在原有方法上做数据类型转换
最后继续执行父类JSONEncoder的后续步骤完成时间类型序列化
import json
import datetime
timesheet = {'today_time': datetime.date.today(),
'today_breather': datetime.time(1, 30)
}
# 序列化的数据类型
# +-------------------+---------------+
# | Python | JSON |
# +===================+===============+
# | dict | object |
# +-------------------+---------------+
# | list, tuple | array |
# +-------------------+---------------+
# | str | string |
# +-------------------+---------------+
# | int, float | number |
# +-------------------+---------------+
# | True | true |
# +-------------------+---------------+
# | False | false |
# +-------------------+---------------+
# | None | null |
# +-------------------+---------------+
class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime.date):
return o.strftime('%Y_%m-%d')
elif isinstance(o, datetime.time):
return o.strftime('%H:%M:%S')
return super().default(0)
res = json.dumps(timesheet, cls=MyJSONEncoder)
print(res) # {"today_time": "2022_07-28", "today_breather": "01:30:00"}
面向对象之封装
1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式
python中没有实际的限制,只不过是改了个名字之后可以获得,但这样就失去了隐藏的意义,所以需遵循规则,按照新的方法去获取数据或修改数据
1.1 格式:以__name格式表示该数据为隐藏数据
1.2 作用:将变化隔离 、便于使用、提高复用性、提高安全性
class School():
school = '华清大学' def __init__(self, name, age, gander):
self.__name = name
self.__age = age
self.__gander = gander # 学生获得学校及个人信息
def student_info(self):
print('''
姓名:%s
年龄:%s
性别:%s
''' % (self.__name, self.__age, self.__gander)) def student_revise_info(self, name, age):
self.__name = name
self.__age = age stu = School('jason', 18, '男')
stu.student_info() # jason
stu.student_revise_info('kevin', 22)
stu.student_info() # kevin
property伪装属性:将方法输出伪装成数据输出
class Student():
school = '南芜大学' def __init__(self, mathematics, major):
self.mathematics = mathematics
self.major = major @property
def total_score(self):
return self.mathematics+self.major stu = Student(90, 50)
res = stu.total_score()
print(res) # 140 无@property
stu = Student(90, 50)
res = stu.total_score
print(res) # 140
面向对象特征之多态:一种事物的多种体现形式
1.定义:定义新的子类、重写对应的父类方法、使用子类的方法直接处理,不调用父类的方法
2.作用 :增加了程序的灵活性、增加了程序可扩展性
class School:
def major(self):
print('摄影专业') class Student1(School):
def major(self):
print('排名第一') class Student2(School):
def major(self):
print('排名倒数第一') stu = School()
stu1 = Student1()
stu2 = Student2()
stu.major() # 摄影专业
stu1.major() # 排名第一
stu2.major() # 排名倒数第一
3.鸭子类型
只要你长得像鸭子 走路像鸭子 说话像鸭子 那么你就是鸭子
面向对象之反射
1.反射:通过字符串来操作对象的数据或方法,存在关键字字符串、对象肯定是需要进行反射操作
2.反射方法
2.1 hasattr():判断对象是否含有某个字符串对应的属性
2.2 getattr():获取对象字符串对应的属性
2.3 setattr():根据字符串给对象设置属性
2.4 delattr():根据字符串给对象删除属性
class School:
school = '南芜大学'
name = 'jason'
def student(self):
print('摄影专业')
stu1 = School()
obj = getattr(stu1, 'school')
print(obj) # 南芜大学
obj = hasattr(stu1, 'school')
print(obj) # True
setattr(stu1, 'major', '摄影专业')
print(stu1.__dict__) # {'major': '摄影专业'}
setattr(stu1, 'rank', '排名第三')
print(stu1.__dict__) # {'major': '摄影专业'}
delattr(stu1, 'rank')
print(stu1.__dict__) # {'major': '摄影专业'}
3.案例:
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()
注:python:一切皆对象
只要你有数据 有功能 那么你就是对象
文件名 文件对象
模块名 模块对象
linux系统:一切皆文件
只要你能读数据 能写数据 那么你就是文件
python面向对象的特征及反射的更多相关文章
- Python面向对象的特征跟私有属性
面向对象的三大特征 继成.封装.多态: 继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类 封装:将数据和方法放在了一个类中就构成了封装 多态:指的一类事物有多重形态,一个抽象类 ...
- python面向对象其他相关-异常处理-反射
1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 2.issubclass(sub, super) 检查sub类是否是 super 类的派生类 n1 = 10 ...
- Python面向对象三大特征
继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会继承 ...
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- Python 面向对象之反射
Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...
- Python面向对象之-反射
Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr 判断是否有改属性或者方法,有返回True,没有返回false getattr 如果是属性获得该属性 ...
- python 面向对象编程 之 反射
1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...
- python面向对象的反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) getattr # 根据字符串的形式,去对象中找成员.hasattr # 根据字符 ...
随机推荐
- swagger在线api文档搭建指南,用于线上合适么?
在上一篇文章中,我们讲解了什么是 api,什么是 sdk: https://www.cnblogs.com/tanshaoshenghao/p/16217608.html 今天将来到我们万丈高楼平地起 ...
- MySQL中的全表扫描和索引树扫描
引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况.在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就是type属性,ty ...
- 华为OPS,自定义命令,动态执行命令
OPS 开放可编程系统OPS(Open Programmability System)是指设备通过提供统一的应用程序接口API(Application Programming Interfa ...
- 由C# dynamic是否装箱引发的思考
前言 前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会".至于为啥会有很多人有这种疑问,主要是因为觉得dynamic可能是因为有点特 ...
- 一文详解 WebSocket 网络协议
WebSocket 协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议.WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据(从而解决Http 1.1协议 ...
- EditText简单登陆界面制作
- CCPC、Petrozavodsk Camp、OpenCup 题解汇总
省赛 \([\text{2021.11.30}]\) 2021 Jilin Collegiate Programming Contest 全部完成. \([\text{2021.12.25}]\) 2 ...
- 什么是HBase?终于有人讲明白了
一.初识HBase HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文.HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeepe ...
- DirectX11 With Windows SDK--40 抗锯齿:FXAA
前言 在默认的情况下渲染,会看到物体的边缘会有强烈的锯齿感,究其原因在于采样不足.但是,尝试提升采样的SSAA会增大渲染的负担:而硬件MSAA与延迟渲染又不能协同工作.为此我们可以考虑使用后处理的方式 ...
- 深度学习与计算机视觉教程(15) | 视觉模型可视化与可解释性(CV通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...