🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇
首先,让我来介绍一下今天的主题。今天我们将讨论封装、反射以及单例模式。除此之外,我们不再深入其他内容。关于封装功能,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快速进修指南:面向对象--高级篇的更多相关文章
- 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
- Python第七章-面向对象高级
面向对象高级 一. 特性 特性是指的property. property这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...
- JAVA开发者的Golang快速指南
Golang作为Docker.Kubernetes和OpenShift等一些酷辣新技术的首选编程语言,越来越受欢迎.尤其它们都是开源的,很多情况下,开源是非常有价值的.深入学习阅Golang等源代码库 ...
- 针对Quant的Python快速入门指南
作者:用Python的交易员 (原创文章,转载请注明出处) 最近有越来越多的朋友在知乎或者QQ上问我如何学习入门Python,就目前需求来看,我需要写这么一篇指南. 针对整个vn.py框架的学习,整体 ...
- MessagePack Java 0.6.X 快速开始指南 - 安装
0.6.x 版本的 MessagePack 已经过期被淘汰了.如果你现在开始使用 MessagePack 话,请不要使用这个版本. 我们再这里保留 0.6.x 版本的内容主要用于参考用途. 最新的 M ...
- python自动化开发-[第八天]-面向对象高级篇与网络编程
今日概要: 一.面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) 2.__setattr__,__getattr__,__delattr__ 3.二 ...
- Python学习笔记捌——面向对象高级编程
__slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__s ...
- 【Python学习之七】面向对象高级编程——使用@property
参考来自廖雪峰Python教程:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/ ...
- 【Python学习之七】面向对象高级编程——__slots__的使用
1.Python中的属性和方法的绑定 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法. (1)首先,定义一个class: class Stu ...
- 面向对象编程(python)和部分面向对象高级编程
1.类和对象 在python中定义类 class 类名(首字母最好大写)Student (Object(父类)): def __init__(self): self.属性 1= 参数1 self.属性 ...
随机推荐
- 我通过 tensorflow 预测了博客的粉丝数
前言: 由于最近接触了 tensorflow.js,出于试一下的心态,想通过线性回归预测一下博客的粉丝走向和数量,结果翻车了.虽然场景用错地方,但是整个实战方法用在身高体重等方面的预测还是有可行性,所 ...
- K8S | Config应用配置
绕不开的Config配置: 一.背景 在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多: 应用环境:通常是指代码层面 ...
- 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题
四.如何修改 QUICKSORT,使得它能够以非递增序进行排序? 文心一言: 快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计.默认情况下,快速排序会以递增序进行排序.若想修改 ...
- servlet系列:简介和基本使用以及工作流程
目录 一.简介 二.Servlet实现 三.基本使用 1.引入pom依赖 2.实现Servlet规范,重写service方法 3.配置web.xml 4.配置Tomcat 6.运行 四.Servlet ...
- Pixi.js的使用整理
最近在做的一个前端项目中,有一些图像的处理操作(3D图,2D图都有),其中3D图也是通过获取后端服务的图像2D数据进行绘制展示,通过鼠标各种操作调用后端服务来进行重新获取新图数据.这里前端设计到图像的 ...
- AVR汇编(六):分支指令
AVR汇编(六):分支指令 分支指令用于改变程序的执行流,分为无条件分支和条件分支两类. 无条件分支指令 JMP JMP 指令用于无条件跳转,类似于C中的 goto 关键字, JMP 指令的跳转范围为 ...
- Typescript - 索引签名
1 索引签名概述 在 TypeScript 中,索引签名是一种定义对象类型的方式,它允许我们使用字符串或数字作为索引来访问对象的属性. 1.1 索引签名的定义和作用 索引签名通过以下语法进行定义: { ...
- 【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器
问题描述 在App Service for linux上创建一个PHP应用,通过 phpinfo() 查看PHP的扩展设置,发现JIT没有被开启, jit_buffer_size 大小为0. 那么,在 ...
- js监控微信浏览器的自带的返回事件(延迟解决微信返回立即执行popstate事件)
/** * 浏览器回退事件监听 */ var listenerBackHandler = { param: { isRun: false, //防止微信返回立即执行popstate事件 }, list ...
- MySQL实战实战系列 04 深入浅出索引(上)
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到.比如某一个 SQL 查询比较慢,分析完原因之后,你可能就会说"给某个字段加个索引吧"之类的解决方案.但到底什么是索引,索引 ...