首页 > 编程语言 >Python类的内置成员方法 __init__, __new__ 和 __call__

Python类的内置成员方法 __init__, __new__ 和 __call__

时间:2023-10-03 18:44:45浏览次数:38  
标签:__ name Python self init call new

__init__ 和 __new__

这个方法想必大家平常也用的很多,这个方法负责对象的初始化。
什么是初始化呢?就是对已经存在的东西赋若干个初始值。
所以我们可以知道当我们调用 __init__() 方法的时候,这个类已经被实例化了。

我们可以运行一下如下代码

class A():
    def __new__(cls, *args, **kwargs):
        print("run the new of A")
        # return super().__new__(cls) 两句等价
        return object.__new__(cls)

    def __init__(self):
        print("run the init of A")

a = A()

然后我们就会发现,一个类的创建遵循如下步骤

  1. 调用 __new__() 方法,如果自身没有定义,就去父类中查找,直到 object 类
  2. __init__() 方法对实例化的对象本身进行初始化。

也就是实际上我们会先调用 __new__() 来实例化这个类,然后再去调用 __init__() 去对这个对象进行初始化。

然后我们看到 __new__() 传入了一个变量 cls 那么这个是什么呢?
答案是这个是这个类本身

不过我们可能会疑惑,为什么不是 self
答案是 self 代表的是实例对象本身,而不是类本身。

一般情况下,我们不会去重写 __new__ 方法,除非你明确知道自己在做什么。但是在进行一些设计模式的编写的,比如单例模式和工厂模式。

然后我们就可以发现,既然我可以传入自己的类,那么我是不是也可以传入别的类,答案是肯定的。不过这样并不会调用任何人的 __init__() 函数。所以需要你自己手动对对象进行初始化,一般情况下也不会有什么作用。

需要注意的事情是 __new__ 必须要有返回值,返回实例化出来的实例。

__call__

然后我们来看一下另一个内置成员方法 __call__
这个成员方法实际上就是让一个实例对象可以当作一个方法来调用
代码如下

class C:
    def __init__(self, name):
        self.name = name

    def __call__(self, *args, **kwargs):
        print("I'm {}".format(self.name))
c = C("Gensokyo_Alice")
c()

那么这个除了当作方法调用还有什么用呢,众所周知python还有一个方法叫做 hasattr,不过它无法判断指定的名称是类方法还是类属性。
那么我们可以借助 __call__ 来判断。

class C:
    def __init__(self, name):
        self.name = name

    def __call__(self, *args, **kwargs):
        print("I'm {}".format(self.name))

    def dosth(self):
        print("I'm {}".format(self.name))
c = C("Gensokyo_Alice")
if hasattr(c, "name"):
    print(hasattr(c.name, "__call__"))
if hasattr(c, "dosth"):
    print(hasattr(c.dosth, "__call__"))

因为类方法本质是一个可调用对象,所以实现了 __call__ 方法。
而类属性则没有。

标签:__,name,Python,self,init,call,new
From: https://www.cnblogs.com/Gensokyo-Alice/p/17741473.html

相关文章

  • 10.0 探索API调试事件原理
    本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者被调试器附加时,就会产生对应的DEBUG_EVEN......
  • 什么是 Data-Centric Applications 架构
    SAP的经典应用程序(ClassicApplications)主要是面向事务处理的,这种架构在处理大量数据和复杂的分析任务时常会遇到性能瓶颈。为了解决这个问题,SAP引入了一种新的架构范式,即基于SAPHANADatabase的数据中心应用程序(Data-CentricApplications)。这种新的开发范式以数据为中心,能......
  • SAP S/4HANA 的 Data-Centric Applications 编程范式
    SAP数据中心应用开发范式是一种现代化的方法,旨在利用SAPHANA数据库的强大性能和功能来构建灵活、高效、实时的企业应用程序。这种方法与传统的SAP应用程序开发方式,如ClassicApplications,有着显著的不同。在这篇文章中,我将详细介绍SAP数据中心应用开发范式,包括其核心概念......
  • 什么是 Angular 的 Active Support 版本和 Long Term Support 版本
    AngularActiveSupport版本和LongTermSupport版本是Angular框架的两个关键概念,它们在Angular的版本管理和维护策略中起着重要的作用。本文将详细介绍这两种版本,并提供示例以更好地理解它们。1.Angular版本概览在深入讨论ActiveSupport版本和LongTermSupport版本之前,让......
  • 什么是 Spartacus 的 BaseStorefrontModule
    SpartacusBaseStorefrontModule的位置:import{NgModule}from'@angular/core';import{BaseStorefrontModule}from"@spartacus/storefront";import{SpartacusConfigurationModule}from'./spartacus-configuration.module';impo......
  • 什么是 Accessibility 领域的 Bypass Blocks
    Accessibility领域的BypassBlocks是指通过一种或多种方式绕过或规避Web或移动应用程序中的可访问性障碍,以使信息、功能或内容对于所有用户,包括那些具有不同能力或使用不同辅助技术的人,都能够无障碍地访问和使用。这些障碍可能包括视觉、听觉、认知或运动方面的障碍。BypassBlock......
  • ng update 命令的 force 选项
    在Angular中,ngupdate命令用于更新Angular项目的依赖包和配置文件。ngupdate命令的基本语法如下:ngupdate[package-name]其中,[package-name]是要更新的包的名称。通常,你可以使用@angular/cli作为[package-name]来更新AngularCLI工具。例如:ngupdate@angular/cli然而,在某......
  • 使用 Stable Diffusion 本地版时遇到显卡驱动过旧的问题
    我本地安装了一个StableDiffusion,使用它生成图片时,遇到了如下错误消息:BC:\WINDOWS\systvenv"C:\app\stable-diffusion-webui-master\venv\Scripts\Python.exe"Python3.10.8(tags/v3.10.8:aaaf517,Oct112022,16:50:30)[MScv.193364bit(AMD64)]Commithash:Trac......
  • Stable Diffusion 里 GFPGAN、ESRGAN 和 RealESRGAN 的功能介绍
    StableDiffusion是一个深度学习技术,主要用于图像生成和图像增强任务。它的核心思想是通过稳定的训练过程来生成高质量的图像,同时提供了一种用于生成和增强图像的框架。在StableDiffusion中,GFPGAN、ESRGAN和RealESRGAN都是与图像生成和增强相关的功能,它们各自有不同的应用......
  • 什么是语义化版本里的 Major,Minor 和 Patch 版本号
    语义化版本(SemanticVersioning):Major、Minor和Patch版本号解析语义化版本,通常简称为SemVer,是一种软件版本号的标准化方案,旨在使软件版本号的管理更加透明和可预测。它主要由三个部分组成:Major(主版本号)、Minor(次版本号)和Patch(修订版本号)。在这篇文章中,我们将深入解释这三个部分......