【Python】学习Python面向对象编程的疑问

(Java菜鸟来学Python了)

🤔

1. 静态方法与类方法什么区别?

实例方法只能被实例对象调用(Python3 中,如果类调用实例方法,需要显示的传self, 也就是实例对象自己),静态方法(由@staticmethod装饰的方法)、类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。
实例方法,第一个参数必须要默认传实例对象,一般习惯用self。
静态方法,参数没有要求。
类方法,第一个参数必须要默认传类,一般习惯用cls。

2. 构造方法与初始化方法什么区别?

__new__ 方法:

  1. 作用: __new__ 方法用于创建一个新的实例对象。它是一个类方法,负责实例的创建并返回这个实例。这个方法的第一个参数是类本身,之后的参数与类的构造函数一致。
  2. 调用时机: __new__ 方法在 __init__ 方法之前被调用。它是类的实例化过程中的第一步。
  3. 返回值: 通常情况下,__new__ 方法会返回一个新创建的实例对象。如果返回的是当前类的实例,那么 __init__ 方法会被调用。如果返回的是其他类的实例,__init__ 不会被调用。
  4. 用途: 通常情况下,你不需要自己定义 __new__ 方法,因为默认的 object 类中已经提供了一个合适的实现。但在一些特殊情况下,比如创建不可变对象时,你可能需要重写 __new__ 方法。

__init__ 方法:

  1. 作用: __init__ 方法用于对创建的实例进行初始化。它是一个实例方法,接收 self 参数和其他参数,用于设置对象的初始状态。
  2. 调用时机: __init__ 方法在 __new__ 方法返回实例后被调用,用于执行实例的初始化操作。
  3. 返回值: __init__ 方法不需要显式返回值。它负责在创建实例后初始化对象的属性等状态。
  4. 用途:__init__ 方法中,你可以进行各种与对象初始化相关的操作,例如设置对象的属性、建立连接等。

那有必要写__new__方法吗

通常情况下,大多数类不需要显式地定义 __new__ 方法,因为在默认情况下,object 类已经提供了一个合适的实现。这个默认的 __new__ 方法负责创建实例并返回它。

但在一些特殊情况下,可能会有必要重写 __new__ 方法。以下是一些可能需要自定义 __new__ 方法的情况:

  1. 不可变对象: 如果你的类创建的对象是不可变的(例如,inttuple),你可能需要重写 __new__ 方法来确保实例创建后不可更改。
  2. 自定义实例创建逻辑: 当你希望在对象创建之前执行一些特殊逻辑时,可以重写 __new__ 方法。这可能包括对象池的使用、单例模式等。
  3. 基于条件的实例化: 有时,根据输入参数的不同,你可能希望返回不同类型的实例。在这种情况下,你可以在 __new__ 方法中根据条件返回不同的实例。

总的来说,对于大多数常规的类,不需要显式定义 __new__ 方法,而是可以依赖于默认实现。在需要自定义实例创建行为时,再考虑重写 __new__ 方法。一般而言,优先使用 __init__ 方法进行对象初始化,而将特殊的实例创建逻辑留给 __new__ 方法。

3. 类中的实例方法必须传形参self

否则调用报错

TypeError: Student.sleep() takes 0 positional arguments but 1 was given
在这里插入图片描述

4. 为什么python的类属性和类方法,也可以通过对象调用

Python 中的类属性和类方法可以被类和对象共享访问。当使用对象去访问类属性或类方法时,Python 会首先在对象的名称空间中查找,如果没有找到对应的属性或方法,则会转而在其类的名称空间中查找。因此,即使通过对象去调用类属性或类方法,实际上是调用了该类的属性或方法。这一点与类的实例化无关,只与类本身有关。可以通过在类内部使用 @classmethod@staticmethod 修饰器来声明类方法和静态方法。需要注意的是,类方法的第一个参数必须是类本身,约定写作 cls,而静态方法则没有类参数,使用时与普通函数相同。

5. python可以动态绑定属性,那绑定的属性和类属性一样,会怎么样

在 Python 中,你可以动态地为对象绑定新的属性。这意味着你可以在运行时为对象添加新的属性,而不需要在类定义中显式地声明这些属性。动态绑定属性可以为对象提供灵活性,但需要注意一些潜在的问题。

如果你动态绑定的属性与类属性同名,它们实际上是不同的属性。当你通过对象访问该属性时,Python 首先在对象实例中查找,然后才在类中查找。如果对象实例中存在同名的属性,它会优先使用对象实例中的属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/206700.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

13、深度学习之神经网络

深度学习是机器学习中重要的一个学科分支,它的特点就在于需要构建多层“深度”的神经网络。 人们在探索人工智能初期,就曾设想构建一个用数学方式来表达的模型,它可以模拟人的大脑,大脑我们都知道,有很多神经元,每个神经元之间通过突触链接。 神经网络的设计就是模仿了这…

CRM系统中的联系人是什么?如何进行联系人管理?

上手CRM系统前掌握专业术语是必要的功课,在第一次使用CRM系统时小编和大家一样,分不清楚线索、联系人、客户、商机之间的关系,今天我们就来着重分享一下CRM中联系人是什么?如何进行联系人管理? CRM系统联系人是指能够…

物联网AI MicroPython学习之语法 WDT看门狗外设

学物联网,来万物简单IoT物联网!! WDT 介绍 模块功能: 看门狗WDT(WatchDog Timer)外设驱动模块 接口说明 WDT - 构建WDT对象 函数原型:WDT(timeout)参数说明: 参数类型必选参数&#xff1f…

每日一练:质因数分解

1. 题目 从键盘输入一个整数,开始整数的质因数分解,最后打印出该整数的所有质因数。 2.解题思路 1)初始化: 从最小的质数开始,将输入的整数不断除以质数,直到无法整除为止。   2)循环&#x…

哈希表之开散列的实现

回顾与引出 我们在上一节用闭散列的开放定址法实现了哈希表。不难看出这种方法有明显的缺点:一旦发生哈希冲突,所有的冲突连在一起,容易产生数据“堆积”,即:不同 关键码占据了可利用的空位置,使得寻找某关…

HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)

准备数据集 使用编码工具 首先需要加载编码工具,编码工具可以将抽象的文字转成数字,便于神经网络后续的处理,其代码如下: # 定义数据集 from transformers import BertTokenizer, BertModel, AdamW # 加载tokenizer token Ber…

VR全景校园:不被简单定义的校园展示,看的不止“一面”

学校的宣传,还是仅仅依靠一部宣传片来定义的吗?如今,在这个时代,VR全景技术已经越来越成熟了,并逐渐融入了我们的日常生活中,通过VR全景校园,我们可以在网上真实地感受校园的优美环境&#xff0…

【云原生】初识 Service Mesh

目录 一、什么是Service Mesh 二、微服务发展历程 2.1 微服务架构演进历史 2.1.1 单体架构 2.1.2 SOA阶段 2.1.3 微服务阶段 2.2 微服务治理中的问题 2.2.1 技术栈庞杂 2.2.2 版本升级碎片化 2.2.3 侵入性强 2.2.4 中间件多,学习成本高 2.2.5 服务治理功…

Android JNI 异常定位(2)—— addr2line

Android native报错有时候只有一句 signal 11 (SIGSEGV),这种情况仅通过log是很难定位到问题的。不过Android 在/data/tombstones目录保存了错误的堆栈信息,为定位bug提供了路径。不过一般这里的log都无法像java一样直接定位的出错的行数。如下图&#x…

吴恩达《机器学习》9-7-9-8:综合起来、自主驾驶

在神经网络的使用过程中,需要经历一系列步骤,从网络结构的选择到训练过程的实施。以下是使用神经网络时的主要步骤的小结: 一、网络结构的选择 输入层: 第一步是选择网络结构,即确定神经网络的层数以及每层的单元数。…

AIGC前沿技术与数字创新应用合作交流和论坛发布活动圆满落幕

2023年11月17日下午,AIGC前沿技术与数字创新应用合作交流和论坛发布活动在北京市海淀区牡丹科技楼B座B1报告厅成功举办。 在这个以技术为驱动力的时代,AIGC等这些前沿技术正以惊人的速度改变着我们的生活和产业格局。利用新兴技术和数字化工具来解决问题…

Unity中Shader反射环境

文章目录 前言一、制作反射环境的两种办法法1:属性面板接收一个 Cubemap 作为反射环境法2:把环境烘焙成一张Cubemap 二、在Unity中实现把环境烘焙成一张Cubemap1、先创建一个反射探针(可以直接创建,也可以空物体增加组件&#xff…