当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性。它使用了一些独特的关键字,如self和cls,这些不仅增强了代码的可读性,还提供了对类和实例的明确引用。正如Java,Python也依赖于对象和类的概念,允许我们通过定义类来创建和操作对象。尽管在表面上Python和Java在面向对象的实现上看似相似,但实际上,它们在细节处理上存在一些显著的差异。接下来,我们将探索这些差异,并深入了解它们在实际应用中的具体表现,以便更好地理解面向对象编程在不同语言中的独特风格和优势。

Python中的类声明

首先,你需要声明一个类。在Python中,这通常是通过使用class关键字来完成的。下面是一个简单的类声明的示例:

class MyClass:
myAttr = "类的属性"
def __init__(self, attribute):
self.attribute = attribute def my_method(self):
return f"Value of attribute is {self.attribute}"

关于上面的类声明你可能发现了attribute和myAttr属性不一样,不报错吗?这就是Python的特点:动态属性赋值。在Python中,不仅可以在类的初始化方法__init__中直接定义新的属性,还可以在对象创建之后的任何时刻动态地添加属性,这种做法在Java中会引发错误,但在Python中却是完全合法的,反映了其动态类型的本质。下面再详细说下。

在Java中,this关键字是隐式的,用于指代当前对象的实例,而在Python中,self必须显式声明并作为方法的第一个参数传递。

返回值里的f在这里表示格式化,它使得在字符串中直接嵌入表达式成为可能。Python会自动进行求值并将结果转换为字符串。

创建对象

一旦定义了类,就可以使用该类来创建对象。这是通过简单地调用类名并传递必要的参数来完成的。例如:

my_object = MyClass("Hello")
my_object.subAttr = "是子类的"
print(my_object.subAttr) #输出:是子类的
print(my_object.my_method()) # 输出:Value of attribute is Hello

虽然在Python中,self关键字需要显式地在方法定义中指出,但其实它的作用与Java中的this关键字相似,代表着方法所属的对象实例。在调用实例方法时,Python会自动将对象实例作为第一个参数传递给self,因此在正常使用实例方法时,我们无需显式地传递这个参数。例如,在调用my_object.my_method()时,my_object实例会自动作为self参数传递给my_method。这种机制确保了方法能够访问和操作所属对象实例的数据。

如果尝试直接通过类名来调用实例方法,如MyClass.my_method(),将会引发错误。这是因为没有提供必要的实例参数,导致self没有被正确初始化。要想通过类名调用方法,方法必须是类方法或静态方法。来看下

类方法和静态方法

在Python中,@classmethod和@staticmethod是两种常用的方法装饰器,它们分别用于定义类方法和静态方法。

其特点是第一个参数通常是cls,代表着类本身。这与实例方法中的self参数相似,但有一个重要的区别:cls参数指向类,而不是类的某个特定实例。类方法的一个限制是它们无法访问特定实例的属性,因为它们不与任何实例绑定。

class MyClass:
@classmethod
def my_class_method(cls):
# 可以访问类属性,如cls.some_class_attribute
return "这是一个类方法"

静态方法实际上是独立于类的实例和类本身的。静态方法不接收传统意义上的self或cls参数,这意味着它们既不能访问类的实例属性(即对象级别的数据),也不能访问类属性(即与类本身相关联的数据)。静态方法的这种特性使得它们更像是普通函数,但为了逻辑上的整洁和组织性,它们被放置在类的定义中。

class MyClass:
@staticmethod
def my_static_method():
return "这是一个静态方法"

总结

作为一名有着Java背景的开发者,你无疑已经习惯了Java那严格的类型系统和细致的访问控制机制。转向Python,你会发现一个截然不同的编程世界。Python的面向对象编程(OOP)方式为代码组织提供了更高的自由度和灵活性,这种变化可能会给你带来新鲜感,同时也是一个挑战。需要注意的是,Python的这种灵活性可能会导致更少的编译时错误检查。由于Python是一种解释型语言,很多错误只有在运行时才会被捕捉到。

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

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

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

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

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

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

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

  4. python抽象篇:面向对象基础

    1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...

  5. Python面向过程和面向对象基础

    总结一下: 面向过程编程:根据业务逻辑从上到下的写代码-----就是一个project写到底,重复利用性比较差 函数式:将某些特定功能代码封装到函数中------方便日后调用 面向对象:对函数进行分类 ...

  6. Python快速入门

    Python快速入门 一.基础概要 命名:h.py Linux命令行运行:python h.py 注释.数字.字符串: 基本类型只有数字与字符串 #python注释是这样写的 ''' 当然也可以这样 ...

  7. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  8. 阿里巴巴泰山版《Java 开发者手册》,也是一份防坑指南

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  9. Java快速扫盲指南

    文章转自:https://segmentfault.com/a/1190000004817465#articleHeader22 JDK,JRE和 JVM 的区别 JVM:java 虚拟机,负责将编译 ...

  10. Java程序员的现代RPC指南(Windows版预编译好的Protoc支持C++,Java,Python三种最常用的语言,Thrift则支持几乎主流的各种语言)

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

随机推荐

  1. 修复grub分区

    修复grub分区 实验环境:grup.cfg文件丢失,引导出错 1,删除grup.cfg配置文件 2,重启虚拟机 3,重启进入救援模式 再读进度条的时候快速点击Esc键 选着光驱或者u盘启动  

  2. 洛谷 P1122 最大子树和 题解

    一道入门的树形DP. 首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序.单调.子问题等等性质),以便于后续的转化.推理和处理.有序化可以"转化和创造 ...

  3. 从零玩转系列之微信支付实战PC端项目构建+页面基础搭建 | 技术创作特训营第一期

    一.前言 欢迎来到本期的博客!在这篇文章中,我们将带您深入了解前端开发领域中的一个热门话题: 如何使用 Vue 3 和 Vite 构建前端项目.随着现代 Web 应用程序的需求不断演进, 选择适当的工 ...

  4. 干了这么多年C#,后悔没早点用这种“分页”,简单/高效/易维护

    [前言] 干了这么多年C#,后悔没早点用这种"分页",简单/高效/易维护,比其它的分页方式强多了,不信你自己看. [正文] 支持.Net Core(2.0及以上)与.Net Fra ...

  5. quarkus数据库篇之三:单应用同时操作多个数据库

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 一个应用同时连接多个数据库进行操作,这是常见 ...

  6. 带你快速上手HetuEngine

    本文分享自华为云社区<[手把手带你玩转HetuEngine](一)HetuEngine快速上手>,作者:HetuEngine九级代言. HetuEngine是什么 HetuEngine是华 ...

  7. 初识Redis与桌面客户端

    Redis介绍 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redi ...

  8. 干掉 CRUD!这个API开发神器效率爆炸,无需定义MVC类!!

    简介 magic-api 能够只通过 UI 界面就能完成简单常用的接口开发,能够支持市面上多数的关系性数据库,甚至还支持非关系性数据库 MongoDB. 通过 magic-api 提供的 UI 界面完 ...

  9. VINS中的重力-尺度-速度初始化(2)

    VINS中的重力-尺度-速度初始化(2) 细化重力 \(\quad\)上一篇文章中得到的 \(g\) 一般是存在误差的.因为在实际应用中,当地的重力向量的模一般是已知固定大小的(所以只有两个自由度未知 ...

  10. 解密Linux中的通用块层:加速存储系统,提升系统性能

    通用块层 通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响.它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提 ...