• 目录

    • 派生类实操

    • 面向对象特征之封装

    • 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面向对象的特征及反射的更多相关文章

  1. Python面向对象的特征跟私有属性

     面向对象的三大特征 继成.封装.多态: 继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类 封装:将数据和方法放在了一个类中就构成了封装 多态:指的一类事物有多重形态,一个抽象类 ...

  2. python面向对象其他相关-异常处理-反射

    1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象   2.issubclass(sub, super) 检查sub类是否是 super 类的派生类 n1 = 10 ...

  3. Python面向对象三大特征

    继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会继承 ...

  4. 简学Python第七章__class面向对象高级用法与反射

    Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群  群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...

  5. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  6. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  7. python 面向对象编程 之 反射

    1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  8. Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  9. python面向对象的反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) getattr # 根据字符串的形式,去对象中找成员.hasattr # 根据字符 ...

随机推荐

  1. 【算法】希尔排序(Shell Sort)(四)

    希尔排序(Shell Sort) 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之处在于,它会优先比较距离较远的元素.希尔排序又叫缩小增量排序. ...

  2. 445. Add Two Numbers II - LeetCode

    Question 445. Add Two Numbers II Solution 题目大意:两个列表相加 思路:构造两个栈,两个列表的数依次入栈,再出栈的时候计算其和作为返回链表的一个节点 Java ...

  3. Java高并发-无锁

    一.无锁类的原理 1.1 CAS CAS算法的过程是这样:它包含3个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值.仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同, ...

  4. HTML表格以及表单

    学习内容: 1.HTML表格 代码实例: <%@ page language="java" import="java.util.*" pageEncodi ...

  5. 【产品】如何写好APP描述

    你有没有想过越是需要花钱购买的 App,用户会更认真阅读你的 App描述?本文列举了15个 app 描述,看看哪些是我们以前忽略了的,哪些是我们也犯过的错误.图中有红色背景的文字是需要强调的地方,这些 ...

  6. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  7. C++编码规范(本人自定义)

    C++编码规范 1.变量名用camelCase命名法(即lowerCamelCase,小驼峰拼写法)命名. 即小写字母开头,如果变量名是复合词,第二个单词的首字母大写. 举例: int digitsC ...

  8. CabloyJS的微信API对接模块:当前支持微信公众号和微信小程序

    Cabloy-微信是什么 Cabloy-微信是基于CabloyJS全栈业务开发框架开发的微信接口模块,当前整合了微信公众号和微信小程序的接口,达到开箱即用的使用效果.在Cabloy-微信的基础上,可以 ...

  9. conda命令的使用,环境安装,创建环境以Anaconda为例

    Anaconda用命令conda创建环境: 安装Anaconda后,用Conda –version查看conda的版本号: Conda create -n name python = x.xx Con ...

  10. 你真的了解git的分支管理跟其他概念吗?

    现在前端要学的只是太多了,你是不是有时会有这个想法,如果我有两个大脑.一个学Vue,一个学React,然后到最后把两个大脑学的知识再合并在一起,这样就能省时间了. 哈哈,这个好像不能实现.现实点吧!年 ...