__new__/__init__/super()详解

本文详细解释了Python中__new__构造方法的作用,包括实例化过程和不同测试案例。同时介绍了super()在类继承中的使用,展示了如何通过super()在子类方法中调用父类的方法。
Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

__new__/__init__/super的用法详解

__new__讲解:

__new__称作构造方法,属于类方法,用于创建一个实例对象。必须要有返回值,如果返回的是本类的实例,则返回实例对象会自动调用__init__方法(如果定义了该方法的话),如果返回的不是本类实例,则不会调用本类的__init__方法。

class Test:
    def __init__(self):
        print("TEST __init__")

class A:

    def __new__(cls, *args, **kwargs):
        print("enter __new__")
        obj = object.__new__(cls, *args, **kwargs) # 测试1
        obj = object.__new__(Test, *args, **kwargs)  # 测试2
        print(obj, obj.__class__)
        return obj

    def __init__(self):
        print("enter __init__")
        self.n = 2

# 测试1:把测试2代码注释掉
A()
#输出:
'''
enter __new__
<__main__.A object at 0x00000000028F6668> <class '__main__.A'>
enter __init__
'''

# 测试2:把测试1代码注释掉
A()
# 输出:
'''
enter __new__
<__main__.Test object at 0x00000000028D6668> <class '__main__.Test'>
'''

super讲解:

super()主要应用在类的继承。super()返回的是根据继承树解析最近的类对象,继承树可以通过cls.mro(), 或者cls.__mro__拿到。super(fatherclass, self)可以指定从哪个类对象之后的继承树开始查找。

class A:
    def __init__(self):
        print("A.__init__")
        super().__init__()
        self.n = 2

    def add(self, m):
        print('self is {0} @A.add'.format(self))
        self.n += m


class B(A):
    def __init__(self):
        print("B.__init__")
        super().__init__()
        self.n = 3

    def add(self, m):
        print('self is {0} @B.add'.format(self))
        super().add(m)
        self.n += 3


class C(A):
    def __init__(self):
        print("C.__init__")
        super().__init__()
        self.n = 4

    def add(self, m):
        print('self is {0} @C.add'.format(self))
        super().add(m)
        self.n += 4


class D(B, C):
    def __init__(self):
        print("D.__init__")
        super().__init__()
        self.n = 5

    def add(self, m):
        print('self is {0} @D.add'.format(self))
        super().add(m)
        self.n += 5


print(D.mro())
d = D()
d.add(2)
print(d.n)

# 输出:
'''
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
D.__init__
B.__init__
C.__init__
A.__init__
self is <__main__.D object at 0x00000000028C1A90> @D.add
self is <__main__.D object at 0x00000000028C1A90> @B.add
self is <__main__.D object at 0x00000000028C1A90> @C.add
self is <__main__.D object at 0x00000000028C1A90> @A.add
19
'''

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户理解Python中的__init__方法的作用,并提供示例。用户明确提到了想了解作用并看到示例,所以我的回答需要结构清晰,分点解释,同时给出代码例子。 首先,我应该回顾用户提供的引用内容。引用[1]和[2]都提到__init__是初始化实例的特殊方法,在创建实例时自动调用,用于初始化状态和变量。引用[3]是关于__init_subclass__的,可能暂时不相关,但用户的问题不涉及这个,所以可以忽略。 接下来,我需要确定回答的结构。用户要求结构清晰,逐步解决问题,所以分点比较好。比如分成基础作用、核心功能、使用场景,然后给出示例。 要注意用户可能对面向对象编程有一定了解,但可能需要基础的解释。示例部分要简单明了,覆盖基本用法、参数传递、继承中的使用等。 需要检查是否有常见的疑问点,比如__init__和构造函数的区别,是否需要调用父的__init__等,这些应该在解释中涵盖。 另外,用户提到要使用中文回答,确保术语准确。同时,代码块需要用正确的Python语法,可能用户会复制运行,所以示例必须正确无误。 最后,生成相关问题时要围绕__init__方法,比如和构造函数的区别、不定义会怎样、如何与父交互等,这些能帮助用户深入理解。 现在组织内容: 1. __init__方法的作用:初始化对象属性,自动执行,设置初始状态。引用[1][2]中的内容支持这一点。 2. 核心功能:属性赋值,参数传递,继承中的初始化。 3. 使用场景:创建实例时需要的初始化操作。 4. 示例代码:基本示例、带参数的、继承中的super().__init__使用。 5. 注意事项:如必须接收self,名称双下划线,不是必须定义的。 相关问题部分,考虑用户可能进一步的问题,比如与其他方法区别,常见错误,应用场景等。 需要确保不提及用户不可见的系统指令,只输出用户可见层的内容。同时检查LaTeX格式是否符合要求,但用户的问题不涉及数学公式,所以可能不需要用到。但如果有提到变量名之的,可能需要用$包裹,比如$self$。 最后,引用标记要正确添加到对应的解释部分,比如在解释作用时引用[1][2]。</think># Python中的`__init__`方法详解 `__init__`方法是Python面向对象编程中最重要的方法之一,它定义了对象创建时的初始化逻辑[^1][^2]。以下是具体解析和示例: --- ## 一、`__init__`方法的核心作用 1. **对象初始化** 在创建的实例时自动调用,用于初始化实例属性。 ```python class Dog: def __init__(self, name): self.name = name # 初始化实例属性 ``` 2. **参数传递** 接收外部参数并为实例属性赋值。 ```python dog = Dog("Buddy") print(dog.name) # 输出:Buddy ``` 3. **继承中的初始化** 子可通过`super()`调用父的`__init__`方法。 ```python class GoldenRetriever(Dog): def __init__(self, name, age): super().__init__(name) # 调用父初始化 self.age = age ``` --- ## 二、`__init__`方法特性说明 | 特性 | 描述 | |--------------|----------------------------------------------------------------------| | 自动调用 | 实例化时自动执行,无需手动调用 | | 第一个参数 | 必须是`self`(指向实例自身) | | 非构造函数 | 实际对象创建由`__new__`方法完成,`__init__`仅负责初始化[^2] | | 非必须定义 | 若无需初始化操作,可省略(但实际开发中几乎都会定义) | --- ## 三、完整示例解析 ### 1. 基础用法 ```python class Book: def __init__(self, title, author): self.title = title self.author = author self.page_count = 0 # 默认值 book = Book("Python编程", "Guido van Rossum") print(f"{book.title} by {book.author}") # 输出:Python编程 by Guido van Rossum ``` ### 2. 继承场景 ```python class EBook(Book): def __init__(self, title, author, file_size): super().__init__(title, author) self.file_size = f"{file_size}MB" ebook = EBook("Fluent Python", "Luciano Ramalho", 5) print(ebook.file_size) # 输出:5MB ``` --- ## 四、常见问题解答 1. **与构造函数的区别** - `__new__`:实际创建实例(构造函数) - `__init__`:初始化已创建的实例(初始化方法) 2. **不定义`__init__`会怎样?** 实例仍可创建,但无法自动初始化属性,需手动赋值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值