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 # 根据字符 ...
随机推荐
- npm 是什么?
npm 是什么? 本文写于 2020 年 6 月 16 日 最近帮几个同学装开发环境,发现他们会各种"卡死"在 npm 安装一些包的过程中. 他们会非常纠结这个命令我明明敲的和网上 ...
- 为什么列式存储会被广泛用在 OLAP 中?
大家好,我是大D. 不知是否有小伙伴们疑问,为什么列式存储会广泛地应用在 OLAP 领域,和行式存储相比,它的优势在哪里?今天我们一起来对比下这两种存储方式的差别. 其实,列式存储并不是一项新技术,最 ...
- 超级简单!CentOS-8 安装 MySQL 8.0,比喝水还简单
中国人不骗中国人 果然是系统和MySQL的版本越高安装越便利了 在阿里云的 CentOS-8 比喝开水还简单的安装 MySQL 8.0,开始~ 1.以 root 用户通过 CentOS 软件包管理器来 ...
- netty系列之:使用Jboss Marshalling来序列化java对象
目录 简介 添加JBoss Marshalling依赖 JBoss Marshalling的使用 总结 简介 在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外, ...
- scanf需要多输入一行是什么问题
有大佬知道用scanf输入,执行程序要多输入一行才能运行一般是什么问题呢 scanf的问题,其中多了\n. scanf如果加入\n,会导致需要多输入一次数据. 错误实例:
- python闭包函数与装饰器
目录 闭包函数 闭包概念 实际应用 装饰器 简介 简单版本装饰器 进阶版本装饰器 完整版本装饰器 装饰器模板 装饰器语法糖 装饰器修复技术 问题 答案 闭包函数 闭包概念 闭:定义在函数内部的函数 包 ...
- Asp.Net Core Identity 多数据库支持
Asp.Net Core Identity 是.Net自带的身份认证系统,支持用户界面 (UI) 登录功能,并且管理用户.密码.配置文件数据.角色.声明.令牌.电子邮件确认等等.使用Visual St ...
- PostgreSQL 13支持增量排序(Incremental Sorting)
PostgreSQL 13支持增量排序(Incremental Sorting) PostgreSQL 13一个重要的功能是支持增量排序,使用order by 时可以加速排序,SQL如下 select ...
- 认识一下什么是JSP
摘要:JSP,全称是Java Server Pages,即Java服务器页面,是由Sun Microsystems公司主导创建的一种动态网页技术标准. 本文分享自华为云社区<Java服务器页面- ...
- Visual Studio 2010 ~ 2022 全系列密钥
更新记录 2022年6月10日 修改序列号顺序. Visual Studio 2022 Professional(专业版): TD244-P4NB7-YQ6XK-Y8MMM-YWV2J Enterpr ...