首页 > 编程语言 >Java开发者的Python快速进修指南:面向对象基础

Java开发者的Python快速进修指南:面向对象基础

时间:2023-11-25 20:01:20浏览次数:32  
标签:Java Python attribute self 实例 开发者 my

当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升。不同于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,attribute,self,实例,开发者,my
From: https://blog.51cto.com/StudiousXiaoYu/8562075

相关文章

  • Java基于协同过滤算法开发的springboot+vue服装商城
    演示视频https://www.bilibili.com/video/BV1oH4y127fq/?share_source=copy_web&vd_source=11344bb73ef9b33550b8202d07ae139b主要功能:用户可以浏览商品和特价商品,加入购物车,直接下单支付,在我的个人中心里可以管理自己的订单,收货地址,编辑资料等。管理员可以发布商品,上下架商品,处......
  • Java基于springoot开发的企业招聘求职网站
    演示视频: https://www.bilibili.com/video/BV1xw411n7Tu/?share_source=copy_web&vd_source=11344bb73ef9b33550b8202d07ae139b技术:springoot+mysql+vuejs+bootstrap+poi+制作word模板主要功能:求职者可以注册发布简历,选择简历模板,上传简历,搜索职位,投递简历,给hr留言,查看自己投......
  • Java 程序里 transient 关键字的使用方法介绍
    在Java中,transient是一个关键字,主要被用于管理序列化过程中哪些字段需要被忽略。在序列化过程中,如果一个字段被声明为transient,那么这个字段就不会被序列化。什么是序列化呢?序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,序列化可以通过实现java.io......
  • Java开发者的Python快速进修指南:面向对象进阶
    在上一期中,我们对Python中的对象声明进行了初步介绍。这一期,我们将深入探讨对象继承、组合以及多态这三个核心概念。不过,这里不打算赘述太多理论,因为我们都知道,Python与Java在这些方面的主要区别主要体现在语法上。例如,Python支持多重继承,这意味着一个类可以同时继承多个父类的属......
  • 聪明办法学python
    一、输入输出在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:函数依次打印每个字符串,遇到逗号“,”会输出一个空格print('Thequickbrownfox',......
  • pythonDay16
    wraps装饰器补充 有参函数补充,特殊情况 有参函数装饰器,登录功能当中当账号密码来源于不同地方时 有参函数装饰器有语法糖(解决方案一,但比较复杂)有语法糖的解决方案二 有参装饰器的模板 什么是可迭代对象、什么叫迭代器,如何用 迭代器如何取值 for循环也可以......
  • python学习笔记-websocket介绍
    一、websocket介绍概述-http,socket实现,短链接,请求响应-websocket,socket实现,双工通道,请求响应,推送socket创建连接,不断开二、websocket握手过程分析socket入手-服务端(socket服务端)1、服务端开启socket,监听IP和端口3、允许连接*5、服务端接收特殊值【加密sha1,特殊值,magic......
  • 聪明办法学Python_task2_11.22-11.26
    聪明办法学Python_task2_11.22-11.26聪明办法学Python_task2_11.22-11.261.task03:数据类型和操作1.1常用基本类型1.2常用内置常数1.3常用内置运算符1.4逻辑运算1.5isinstance()2.task04变量与函数2.1变量2.1.1变量命名规则2.1.2多变量赋值2.2函数......
  • 聪明办法学python-task034
    python要点conda![1700559481851](C:\Users\25322\Documents\WeChatFiles\wxid_xc71h7t6nm2i22\FileStorage\Temp\1700559481851.png)注释单行注释以#开头多行注释可以用多个#号,还有'''和""".程序员最讨厌的10件事:0:别人的代码不写注释​......
  • Java 中如何解决跨域问题
    文章目录背景一、什么是跨域?为什么会出现跨域二、Java实现跨域方式2.1、返回新的CorsFilter(全局跨域)2.2、重写WebMvcConfigurer(全局跨域)2.3、使用注解(aa局部跨域)2.4、手动设置响应头(局部跨域)2.5、使用自定义filter实现跨域2.6、SpringCloudGateway跨域配......