python 封装调用之class 、_init__、self搞懂了

本文深入解析Python中的类封装,探讨__init__方法的作用与使用,通过实例演示如何在类中初始化对象属性,以及如何在外部调用类的方法进行操作。

python 封装调用之class 、_init__、self搞懂了

参考:https://www.cnblogs.com/yulongzhou/p/10654185.html

__init__方法

其前面带有”__“,故此函数被声明为私有方法,不可类外调用。此方法可以带参数初始化

1.

写了模块searchpage.py:

# -*- coding:utf-8 -*-

class search:
    def __init__ ( self, driver ):
        self.driver = driver

    def search_contacts( self, name ) :
        serch="com.tencent.mm:id/r_"
        conte="com.tencent.mm:id/m7"
        resus="com.tencent.mm:id/s5"
        #self.driver=driver
        self.driver.find_element_by_id(serch).click()
        self.driver.find_element_by_id(conte).send_keys(name)

        assert len(self.driver.find_elements_by_id(resus))>=1

2.把searchpage.py模块导入,并在TESTCASES.py中执行:

searchpage.py、TESTCASES.py在同一目录下(https://www.cnblogs.com/deliaries/p/11315915.html

import searchpage #在TESTCASES.py脚本导入模块
@pytest.mark.parametrize("name",["han","ha"])
def test_sercha(self,name):
    search=searchpage.search(self.driver)
    search.search_contacts(name)

每行代码解读:

(1)@pytest.mark.parametrize("name",["han","ha"])

'''这是PYTEST装饰器,给装饰的test_sercha函数传参,相当于2组测试数据,第一组是
name="han",第二组是name="ha"。'''

(2)def test_sercha(self,name):
    (2-1)search=searchpage.search(self.driver)

'''类的实例化,传参:这个CLASS参数self.driver是给CLASS的私有方法__init__ ( self, driver )调用'''

    (2-2)search.search_contacts(name)

'''这个是调用searchpage类里面的search_contacts方法,传参为name变量'''

 

 

 

 

 

 

<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`参数?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值