首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符。而对于反射来说,我认为它比Java简单得多,不需要频繁地获取方法和属性,而是有专门的方法来实现。最后,我们将简单地实现一下单例模式,这样面向对象章节就告一段落了。

封装(Encapsulation)

封装是指将数据和方法封装在一个类中。在Python中,我们可以通过属性和方法来实现封装。属性可以通过getter和setter方法来访问和修改,而方法可以在类的内部进行访问和使用。然而,与Java不同的是,虽然方法在Python中是可以调用的,但Java不允许。另外,属性也有一些区别,如果属性以双下划线开头,并且没有声明属性,将无法直接访问。除非你动态赋值,那么将失去封装的作用。

使用双下划线开头的属性是私有属性,下面是一个简单的示例代码:

class Person:
def __init__(self, name, age):
self.__name = name # def get_name(self):
return self.__name def set_name(self, name):
self.__name = name person = Person("xiaoyu")
print(person.get_name()) # 输出:xiaoyu

我们都是学习Java的,所以对于getter和setter方法的使用应该是基本常识了。记住在Python中,我们使用双下划线来定义私有属性,但实际上这只是一种约定,Python并没有真正的私有属性概念。我们可以通过一些特殊的方式来访问和修改私有属性,但这违背了封装的原则,不建议直接这样做。

反射(Reflection)

反射是一种强大的编程技术,它使得在运行时可以动态地获取和修改对象的属性和方法。在Python中,我们可以利用内置的getattr()、setattr()和hasattr()等函数来实现反射的功能。通过反射,我们可以在运行时根据需要获取或修改对象的属性和方法,从而实现更灵活和动态的编程。不过,我还是有原则的,毕竟Java作为一种商业生态体系成熟的编程语言,在各个领域都有着强大的应用和支持,这是其他语言所无法比拟的。

下面是一个简单的示例代码:

class MyClass:
def __init__(self, name):
self.name = name def hello(self):
print("Hello, {}!".format(self.name)) def dance(self):
print("dance, {}!".format(self.name)) def cmd(self):
method_name = input("====>")
if hasattr(obj, method_name):
method = getattr(obj, method_name)
method() obj = MyClass("xiaoyu")
obj.cmd()

这样就可以获取到方法然后去实现反射了,我就不演示setattr了,自行演示吧。

单例模式(Singleton)

单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并且提供一个全局访问点,方便其他对象对该实例进行调用。在Python中,我们可以通过使用模块级别的变量来实现单例模式,这种方式非常简洁和高效。

下面是一个简单的示例代码,展示了如何在Python中实现单例模式:

class Singleton:
_instance = None @classmethod
def get_instance(cls):
if not cls._instance:
cls._instance = cls()
return cls._instance s1 = Singleton.get_instance()
s2 = Singleton.get_instance() print(s1 is s2) # 输出: True

与Java相似,Python中也可以使用classmethod装饰器来实现方法,只是在Python中我们称之为装饰器而非注解。

另外,Python中也有一种类似于Java中常用的stream流处理for循环的高级用法,只不过在Python中这种写法是倒着的。所以人们称之为字典推导或列表推导。为了方便记忆,我一直称之为推倒。

student = {
"name": "xiaoyu",
"age": 18
} [print(key + ": " + str(value)) for key, value in student.items() if key == "name"]
# 输出 name: xiaoyu

总结

在今天的课上,我们深入讨论了封装、反射和单例模式这几个重要的概念。我不想过多地赘述它们的细节,但是请大家务必记住它们的基本语法规则,因为这也是面向对象章节的结束。我希望大家能够牢牢掌握这些知识点,为未来的学习打下坚实的基础。

🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇的更多相关文章

  1. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...

  2. Python第七章-面向对象高级

    面向对象高级 一. 特性 特性是指的property. property这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...

  3. JAVA开发者的Golang快速指南

    Golang作为Docker.Kubernetes和OpenShift等一些酷辣新技术的首选编程语言,越来越受欢迎.尤其它们都是开源的,很多情况下,开源是非常有价值的.深入学习阅Golang等源代码库 ...

  4. 针对Quant的Python快速入门指南

    作者:用Python的交易员 (原创文章,转载请注明出处) 最近有越来越多的朋友在知乎或者QQ上问我如何学习入门Python,就目前需求来看,我需要写这么一篇指南. 针对整个vn.py框架的学习,整体 ...

  5. MessagePack Java 0.6.X 快速开始指南 - 安装

    0.6.x 版本的 MessagePack 已经过期被淘汰了.如果你现在开始使用 MessagePack 话,请不要使用这个版本. 我们再这里保留 0.6.x 版本的内容主要用于参考用途. 最新的 M ...

  6. python自动化开发-[第八天]-面向对象高级篇与网络编程

    今日概要: 一.面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) 2.__setattr__,__getattr__,__delattr__ 3.二 ...

  7. Python学习笔记捌——面向对象高级编程

    __slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__s ...

  8. 【Python学习之七】面向对象高级编程——使用@property

    参考来自廖雪峰Python教程:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/ ...

  9. 【Python学习之七】面向对象高级编程——__slots__的使用

    1.Python中的属性和方法的绑定 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法. (1)首先,定义一个class:  class Stu ...

  10. 面向对象编程(python)和部分面向对象高级编程

    1.类和对象 在python中定义类 class 类名(首字母最好大写)Student (Object(父类)): def __init__(self): self.属性 1= 参数1 self.属性 ...

随机推荐

  1. Cilium系列-9-主机路由切换为基于 BPF 的模式

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  2. 人工智能如何应对 DevOps 监控和可观测性挑战

    自 ChatGPT 横空出世之后,AIGC 已成为不可逆转的时代浪潮.在之前的文章中,我们介绍了DevOps 领域中AI的用例,需要回顾可以点击下方链接.在本篇文章中,我将简单聊聊人工智能(AI)如何 ...

  3. Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo

    前言   上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好.   大地坐标简介 概述   大地坐标(Geodetic coordi ...

  4. 「AntV」x6 框选添加右键菜单

    今天在群里有个小伙伴提出了这么个问题:如何在框选完成后给框选的区域添加一个右键菜单的功能,我看到了这个问题后也是有点懵,心里想着怎么还有这个需求,直接快捷键删除不是更好吗,谁知这位小伙伴也是这么写的, ...

  5. [Love] VSCODE 调试 LOVE 引擎游戏

    VSCODE调试LOVE引擎游戏 安装插件 配置插件 按 CTRL + SHIFT + P,打开Preferences: Open User Settings (JSON),为settings.jso ...

  6. Visual Studio Code(vscode)下载慢 插件安装失败解决方案

    目录 一.系统环境 二.前言 三.Visual Studio Code(vscode)简介 四.解决Visual Studio Code(vscode)下载慢的问题 4.1 问题描述 4.2 解决方案 ...

  7. 一款国产开源 Web 防火墙神器!

    随着开源 Web 框架和各种建站工具的兴起,搭建网站已经是一件成本非常低的事情,但是网站的安全性很少有人关注,以至于 WAF 这个品类也鲜为人知. 一.WAF 是什么? WAF 是 Web 应用防火墙 ...

  8. 【Python爬虫】python打印本地代理

    在进行网络爬虫时,使用代理是非常重要的.因为爬虫经常会被网站封 IP,而代理可以隐藏你的真实 IP 地址,让你可以更不受限制地爬取数据.本文将介绍如何在 Python 中打印代理,包括代理 IP 的使 ...

  9. SpringCloud-ZipKin搭建保姆级教程

    服务链路追踪 一.服务追踪说明 微服务架构是通过业务来划分服务的,使⽤REST调⽤.对外暴露的⼀个接⼝,可能需要 很多个服务协同才能完成这个接⼝功能,如果链路上任何⼀个服务出现问题或者⽹络超 时,都会 ...

  10. Dubbo源码浅析(一)—RPC框架与Dubbo

    一.什么是RPC 1.1 RPC概念 RPC,Remote Procedure Call 即远程过程调用,与之相对的是本地服务调用,即LPC(Local Procedure Call).本地服务调用比 ...