【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.mzph.cn/news/156908.shtml

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

相关文章

LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型

根据图片生成推广文案, 用的HuggingFace中的image-caption模型 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数…

STM32 寄存器配置笔记——系统时钟配置 HSE as PLL

一、概述 本文主要介绍使用HSE高速外部时钟通过PLL倍频输出72MHZ的时钟作为系统时钟。下图为时钟树。 使用正点原子的开发板调试OSC_IN、OSC_OUT接的是8MHZ的晶振即为HSE时钟。 二、配置流程 1)复位RCC相关的所有寄存器 复位内容是参考正点原子例程,按照…

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术,为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势,并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球,云计算作为一种颠…

多元函数奇偶性

多元函数奇偶性 多元函数的定义域 定义域根据函数的变量数不同,有不同的形式 一元函数 y f ( x ) yf(x) yf(x),定义域可以是数集二元函数 z f ( x , y ) zf(x,y) zf(x,y),定义域可以是一平面区域,是平面点集三元函数 v f ( x , y , z ) vf(x,y,z) vf(x,y,z),定义域是一块空…

ZYNQ_project:lcd_pic_400x400

在lcd液晶屏上显示400x400像素的图片, 像素信息通过电脑的串口调试助手,发送给fpga,存储在例化的双端口ram中, 在要显示图像区域,读取ram中的像素信息。 模块框图: 时序图: 代码:…

O-Star|再相识

暑去秋来,岁月如梭,几名"O-Star"们已经入职一段时间,在这期间他们褪去青涩,逐渐适应了公司的工作环境和文化,迈向沉稳~ 为了进一步加深校招生之间的交流与了解,提高校招生的凝聚力和…

gitlab

Gitlab 安装git yum安装 [rootgit ~]# yum -y install git编译安装 Git官网 #安装依赖关系 [rootgit ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker # 编译安装 [rootgit ~]# tar -zxf git-2.0…

基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

目录 一、前言 二、源码分析 三、负载均衡策略 一、前言 如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可…

Java动态代理JKD版本

1、ISale.java package com.atguigu; public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou(); }2、WuDa.java package com.atguigu;//Target:目标类、目标对象 public class WuDa implements ISale{//target method:目标方法…

DAY60 84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目要求:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 思路 单调栈 本地单调栈的解法和接雨水的题目是遥相呼…

git -1

1.创建第一个仓库并配置local用户信息 git config git config --global 对当前用户所有仓库有效 git config --system 对系统所有登录的用户有效 git config --local 只对某个仓库有效 git config --list 显示配置 git config --list --global 所有仓库 git config --list…

微信小程序 prettier 格式化

一、安装prettier插件 二、打开设置 然后再打开setting.json 新增代码 {"editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml", "**/*.wx…

基于 Glibc 版本升级的 DolphinDB 数据查询性能优化实践

在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系…

专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享

专业课140总分420东南大学920专业综合考研,信息学院通信专业考研分享 我是三月开始系统考研备战,寒假先看的高数全书,奈何在家效率极其低下,才草草看了前三四章。回校后学习的比较认真,每天大概保持10个小时左右&…

3分钟看完NVIDIA GPU架构及演进

近期随着 AI 市场的爆发式增长,作为 AI 背后技术的核心之一 GPU(图形处理器)的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要,特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多,主要就是 NVIDIA、AM…

利用OpenCV实现图片中导线的识别

下面是一个需求,识别图片中的导线,要在图像中检测导线,我们需要采用不同于直线检测的方法。由于OpenCV没有直接的曲线检测函数,如同它对直线提供的HoughLines或HoughLinesP,检测曲线通常需要更多的图像处理步骤和算法&…

java io流中为什么使用缓冲流就能加快文件读写速度

FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会…

UEC++ day7

敌人NPC机制 敌人机制分析与需求 新建一个character类来作为敌人,直接建蓝图设置骨骼网格,因为敌人可能多种就不规定死,然后这个敌人肯定需要两个触发器,一个用于大范围巡逻,一个用于是否达到主角近点进行攻击 注意我…

【Flink】Process Function

目录 1、ProcessFunction解析 1.1 抽象方法.processElement() 1.2 非抽象方法.onTimer() 2、Flink中8个不同的处理函数 2.1 ProcessFunction 2.2 KeyedProcessFunction 2.3 ProcessWindowFunction 2.4 ProcessAllWindowFunction 2.5 CoProcessFunction 2.6 ProcessJo…

https和http的区别和优势

大家好,我是咕噜-凯撒,HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在网络上传输数据的协议,HTTPS相比HTTP在数据传输过程中更加安全可靠,适合对数据安全性要求较高的场景…