• 目录

    • 派生类实操

    • 面向对象特征之封装

    • 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. 超级简单!CentOS-8 安装 MySQL 8.0,比喝水还简单

    中国人不骗中国人 果然是系统和MySQL的版本越高安装越便利了 在阿里云的 CentOS-8 比喝开水还简单的安装 MySQL 8.0,开始~ 1.以 root 用户通过 CentOS 软件包管理器来 ...

  2. vue中使用echarts的两种方法

    在vue中使用echarts有两种方法一.第一种方法1.通过npm获取echarts npm install echarts --save 2.在vue项目中引入echarts 在 main.js 中 ...

  3. 面试官:Dubbo是什么,他有什么特性?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,今天还是过周末,虽然 ...

  4. KALI2020忘记用户名和密码

    时隔半年,打开kali发现忘记了自己精心研制的用户名密码......... 第一步 在开机的时候就按e键进入如下界面 第二步 用键盘上的上下箭头↑↓进行屏幕滚动,滑到最后一行发现修改目标 倒数第四行: ...

  5. Arraylist集合、对象数组

    Arraylist集合 ArrayList是List接口的一个实现类,它是程序中最常见的一种集合. 他的特点:在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此不适合做大量的增删操作,Ar ...

  6. 爱快在PVE下不定时反复重启死机的解决方法

    太长不看版本: 爱快3.6.X在PVE乃至于ESXI下都存在一定的兼容问题! 官网下载3.6.X安装后进入系统设置-升级备份-版本升级,使用爱快3.4.9bin升降级包,下载其中的bin升降级包,将爱 ...

  7. Apache Poi 操作word,替换字符保留样式问题,runs段落混乱问题。

    关于这个问题也是刚好遇到,一通搜索也没有找到类似的或者是有效的方法.下面介绍一下. 首先apache poi的引入 <dependency> <groupId>org.apac ...

  8. tensorflow版本的bert模型 GPU的占用率为100%而其利用率为0%

    Notice: 本方法只是解决问题的一种可能,不一定百分百适用,出现这个问题还有很多其他原因,这个可以作为解决的一种尝试!!! 经过检查发现,是由于激活环境的原因 使用 conda activate ...

  9. 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  10. 安装typescript环境并开启VSCode自动监视编译ts文件为js文件

    一.前言 小编最近开始学习typescript,懂得人都知道,typescript是vue3的基础伴生,配合更加默契.就像vue2和js一样!typescript不像js那样浏览器直接可以解读,需要我 ...