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 # 根据字符 ...
随机推荐
- 【FAQ】分析服务导出的事件数据和概览页面展示的数据不一致该如何解决?
华为分析服务面向开发者提供两种数据展现方式:(1)事件数据下载,开发者可以将事件数据下载后导入到自有的分析系统中:(2)直接在AGC概览页面查看用户数和事件数. 问题描述 某开发者想将事件数据导入到自 ...
- python网络自动化ncclient模块,netconf协议检索与下发交换机配置
以juniper和华为设备为例 交换机必要配置,配置简单,使用ssh模式传输 #juniperset system services netconf ssh#华为 local-user netconf ...
- 234. Palindrome Linked List - LeetCode
Question 234. Palindrome Linked List Solution 题目大意:给一个链表,判断是该链表中的元素组成的串是否回文 思路:遍历链表添加到一个list中,再遍历lis ...
- python操作MySQL与MySQL补充
目录 python操作MySQL 基本使用 SQL注入问题 二次确认 视图 触发器 事务 存储过程 函数 流程控制 索引 练习 python操作MySQL python中支持操作MySQL的模块很多, ...
- PyTorch框架起步
PyTorch框架基本处理操作 part1:pytorch简介与安装 CPU版本安装:pip install torch1.3.0+cpu torchvision0.4.1+cpu -f https: ...
- SpringCloud 服务治理
目录 1. Eureka 1.1 Eureka 介绍 1.2 Eureka 快速入门 父工程 Eureka Server(子工程) pom.xml 启动类 application.yml Eureka ...
- NB-IoT/LoRa/eMTC和蓝牙/WiFi的关系是互补还是替代?
近年来,相继出现了许多物联网技术.WiFi.蓝牙.NB-IoT.LoRa.eMTC和其他技术为IoT实践提供了一流的技术支持通讯端口.拥有这么多技术,能够互相替代吗?还是能起到互补的作用?为低功耗广域 ...
- pytorch自定义模型时实现父类构造函数的问题
问题 有的类继承nn.Module在init函数里面是super(类名, self).init():但是有的里面就是super().init() exp: · 解答: python2与python3的 ...
- 【.NET 6】多线程的几种打开方式和代码演示
前言: 多线程无处不在,平常的开发过程中,应该算是最常用的基础技术之一了.以下通过Thread.ThreadPool.再到Task.Parallel.线程锁.线程取消等方面,一步步进行演示多线程的一些 ...
- zabbix监控mysql主从同步
获取主从复制sql线程和I/O线程状态是否为yes #!/bin/bash HOSTNAME="数据库IP" PORT="端口" USERNAME=" ...