python第六天(普通方法、类方法、静态方法、__init__、__new__)

本文深入解析Python中的类方法、静态方法及__new__与__init__的区别与应用。通过实例代码,阐述了类方法与静态方法的特点,以及__new__与__init__在实例化过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举例代码:

class A:
def init(self):
print(self)
print(“这是构造方法”)
def new(cls, *args, **kwargs):
print(id(cls))
print(“这是new 方法,相当于__init__只是最后的那盘菜,而__new__才是得到食材”)
ret = object.new(cls)
print(ret)
return ret
@classmethod
def FA(cls):
print(“这是类方法,默认是类对象调用方法,参数最好使用默认的cls”)
@staticmethod
def FB(lalala):
print(“这是静态方法,不像普通方法,默认对象调用,(默认self作为函数参数00),这个方法得自己写”)
print(id(A))
print(A())
print("#"*60)
A.FA()
a = A()
#A.FB() a.FB() #报错,静态方法,不像普通方法,默认对象调用
A.FB(“aaaaa”)

运行结果:

2193562339896
2193562339896
这是new 方法,相当于__init__只是最后的那盘菜,而__new__才是得到食材
<main.A object at 0x000001FEBC74D5C0>
<main.A object at 0x000001FEBC74D5C0>
这是构造方法
<main.A object at 0x000001FEBC74D5C0>
############################################################
这是类方法,默认是类对象调用方法,参数最好使用默认的cls
2193562339896
这是new 方法,相当于__init__只是最后的那盘菜,而__new__才是得到食材
<main.A object at 0x000001FEBC74D5C0>
<main.A object at 0x000001FEBC74D5C0>
这是构造方法
这是静态方法,不像普通方法,默认对象调用,(默认self作为函数参数00),这个方法得自己写

Process finished with exit code 0

总结:

0、静态方法,不像普通方法,默认对象调用,(默认self作为函数参数00),这个方法调用参数得自己写
1、 new 至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动 提供
2、 new 必须要有返回值,返回实例化出来的实例,这点在自己实现 new 时要特别注 意,可以return父类 new 出来的实例,或者直接是object的 new 出来的实例
3、 init 有一个参数self,就是这个 new 返回的实例, initnew 的基础上 可以完成一些其它初始化的动作, init 不需要返回值
我们可以将类比作制造商, new 方法就是前期的原材料购买环节, init 方法就是在 有原材料的基础上,加工,初始化商品环节

<think>我们正在讨论Python类中__init__方法中的self.num=1,其中用户特别询问了self的含义。 根据引用[1]和[2],self是指向实例本身的引用。在__init__方法中,我们通过self来设置实例属性。 因此,在self.num=1中: - self代表当前正在创建的实例对象 - num是我们要给这个实例添加的属性名 - 1是给这个属性赋的初始值 因此,我们可以这样解释: 在Python中,当创建一个类的新实例时,会自动调用__init__方法,并将新创建的实例作为第一个参数(通常命名为self)传入。在__init__方法内部,通过self.属性名 = 值 的方式,可以为该实例添加属性并初始化。 例如: class MyClass: def __init__(self): self.num = 1 # 这里self就是当前创建的实例,我们给这个实例添加一个属性num,并赋值为1 这样,每创建一个MyClass的实例,该实例就会有一个num属性,其初始值为1。 接下来,我们按照用户的要求,使用中文回答,并注意以下几点: - 行内数学表达式用$...$,但这里可能用不到数学表达式,但如果有变量名等,可以适当使用。 - 独立公式用$$...$$,但本问题可能不需要。 - 引用标识:在引用参考内容的地方加上[^1]或[^2]等。 同时,根据用户上一次的问题和回答,我们知道用户已经在之前的问题中了解了__init__方法中self.num=1的作用,现在特别关注self的含义。 因此,我们重点解释self。 另外,根据系统指令,我们需要生成相关问题。 结构安排: 1. 直接回答self的含义。 2. 详细解释self在__init__方法中的作用。 3. 举例说明。 4. 注意事项(如为什么必须是self,是否可以换其他名字等)。 5. 生成相关问题。 注意:我们引用的参考内容[1]和[2]都提到了self是指向实例本身的引用,所以我们在回答中引用它们。 开始回答:</think>### Python类中`__init__`方法内`self`的含义详解 在Python类的`__init__`方法中,`self`是一个**指向实例对象本身的引用**。当执行`self.num = 1`时,其含义和运作机制如下: #### 1. `self`的核心作用 - **实例的标识符**:`self`代表当前正在创建或操作的实例对象。通过`self`,可以访问和修改**该特定实例**的属性[^1][^2]。 - **自动传递**:Python在调用`__init__`时会自动将新创建的实例作为`self`参数传入,无需手动传递[^1]。 - **属性绑定**:`self.num = 1`表示: - 在**当前实例**上创建属性`num` - 将其初始值设为`1` ```python class Counter: def __init__(self): # self自动传入 self.num = 1 # 为当前实例添加属性 obj = Counter() print(obj.num) # 输出: 1(通过实例访问) ``` #### 2. 关键特性解析 | 特性 | 说明 | 示例 | |------|------|------| | **实例独立性** | 每个实例的`self.num`独立存在 | `obj1.num=10`不影响`obj2.num` | | **动态属性** | 可在任意方法中通过`self`添加属性 | `__init__`外使用`self.x=5`同样有效 | | **方法访问** | 类方法通过`self`访问实例属性 | `def add(self): self.num += 1` | | **命名惯例** | 非强制命名`self`,但强烈建议遵守 | 可用`this`替代,但会降低可读性 | #### 3. 与普通函数的本质区别 ```python # 普通函数 def func(obj): obj.num = 1 # 需显式传递对象 # 类方法 class MyClass: def __init__(self): self.num = 1 # self自动绑定实例 obj = MyClass() # 自动调用__init__(obj) ``` - 类方法**隐式传递实例**:Python将`obj`作为`self`自动传给`__init__`[^2] - 普通函数需**显式传递对象** #### 4. 底层机制 当创建实例时: 1. Python先调用`__new__()`创建空实例 2. 自动调用`__init__(self)`,传入新实例作为`self` 3. `self.num = 1`在实例的命名空间中添加条目: ```python # 等效底层操作 obj.__dict__['num'] = 1 ``` #### 5. 典型错误场景 ```python class Test: def __init__(this): # 非常规参数名 this.num = 1 # 仍有效但不推荐 print(self.num) # 错误!self未定义 ``` - **参数名必须一致**:若定义`def __init__(this)`,则方法内必须使用`this`访问属性 - **违反惯例的风险**:IDE警告、团队协作问题、可读性下降 #### 6. 为什么需要`self`? - **解决实例标识问题**:明确指定操作哪个实例的属性 - **支持面向对象封装**:实例属性与类属性隔离 - **实现方法共享**:所有实例共享方法代码,但通过`self`访问各自数据[^1] > 关键总结:`self`是Python实现**实例绑定**的语法机制,使不同实例能独立维护自身状态,同时共享类的方法代码[^1][^2]。 --- ### 相关问题 1. 如何在类方法中正确使用`self`访问其他实例方法? 2. 不使用`self`声明实例属性会导致什么问题? 3. Python的`self`机制与其他语言(如Java/C++)的`this`有何异同? 4. 为什么类静态方法(`@staticmethod`)不需要`self`参数?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值