python中的self理解

面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”!!!


1.如何创建类和实例

以Student类为例,在Python中,定义类如下:

class Student():
    pass

上面就定义好了一个类,接下来就可以根据Student类创建一个实例,创建实例是通过类名+()实现的

a=Student()

!!!首先要搞清楚一个问题就是:a=Student() 和 a=Student的区别。

>>>a=Student()
a
<__main__.Student object at 0x1068f0c10>
>>>a=Student
a
<class '__main__.Student'>

从上面的输出可以看出:

  • a=Stuent():有地址,说明他是一个实体,比如 int a 中的 a 一样
  • a=Student:没有地址,这说明他就是一个类名, 等价于上一句中 int a 中的 int

2.self到底指的是什么?

举个例子来说明:

class Student():
    def test_1(self,one):
        print(one)
>>>a=Student() #创建一个实例a
>>>Student.test_1(a,'hi') #self就是实例a!
hi
>>>a.test_1('hi')
hi

结论:

  1. Student.test_1(a,'hi')和a.test_1('hi')的输出结果相同
  2. self指的是类的实例对象本身 ,而不是类本身。也就是说:self就是实例 a 自己!就是你创建的那个实例名字!就是那个上面那个a!(破音ing)
  3. self ,也可以用别的单词来代替。不过大家都约定俗称用self。
  4. 类中的方法第一个参数是 self 的才可以被实例调用,实例对这个参数拥有所有权,即实例中所有的方法都可以使用实例的参数。

3.参数前面的self

在类的代码编写中,我们常常会遇到类似以下的代码:

x=1
class Plus():
    def one(self):
        self.x=10
    def add(self):
        y=5+x
        print(y)

结果:

>>>a=Plus()
>>>a.add()
6

 为什么结果是6而不是15呢?

还是那个原因:self是指代的什么?

self指代的是创建的实例a!add() 方法中的 x 前面没有加 self ,所以他调用的不是实例自身的参数

所以,带self的参数才可以被实例调用,不带self的,跟实例无关。

如果要使用self里面的参数:

class Plus():
    def one(self):
        self.x=10
    def add(self):
        y=5+self.x #注意这句
        print(y)

结果:

>>>a=Plus()#实例化
>>>a.one()#使用self.x值
>>>a.add()#使用add方法
15

4.应用

一般来说我们创建类和实例的时候会使用__init__方法,__init__()方法的作用是初始化一个类的实例。

在创建实例的时候,就把namescore等属性绑上去:

class Student():

    def __init__(self, name, score):
        self.name = name
        self.score = score

注意到__init__方法的第一个参数永远是self表示创建的实例本身。

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:

创建实例:

bart=student('lisa',99)

查看创建后实例的参数。

>>>bart.name
'lisa'
>>>bart.score
99

补充知识:数据封装

面向对象封装的另一个重要特点就是数据封装,在上面的Student类中,每个实例就拥有各自的namescore这些数据,我们可以通过函数来访问这些数据。但是这样从外部访问数据比较麻烦,而数据封装是直接在Student类的内部定义访问数据的函数。这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法

# -*- coding: utf-8 -*-
class Student():

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

#创建一个实例
person=Student('jack',100)
person.print_score()
jack: 100

注意:要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入。

<think>好的,我现在要回答用户关于Pythonself关键字的作用和用法的问题。首先,我需要回忆一下自己了解的Python面向对象编程的知识。self的方法中是一个常见的参数,但具体有什么作用呢? 我记得在Python中,当定义一个的方法时,第一个参数通常是self,这代表的实例本身。通过self,方法可以访问和修改实例的属性,或者调用其他方法。比如,在的方法里,如果要访问实例变量,就需要使用self.变量名。这可能就是self的主要作用之一,将实例本身传递给方法,以便在方法内部操作实例的数据。 接下来,我需要确认用户的问题,他们想知道self的使用场景和作用。可能需要分几个方面来回答:基本作用、方法调用中的使用、继承中的表现,以及是否可以使用其他名称代替self。同时,用户提供的引用中有提到,虽然可以重命名self,但不符合约定,会让其他程序员困惑,这点需要强调。 然后,我需要检查用户提供的引用内容。引用[2]提到,虽然self可以重命名,但不推荐,引用[4]展示了在继承中使用self调用方法的情况。这些都可以作为回答的支撑材料,并添加引用标识。比如,在解释self在方法调用中的作用时,可以引用[4]的例子。 另外,用户可能存在的疑问是,为什么必须要有self参数?或者静态方法和方法中的self有什么区别?可能需要简要说明,普通实例方法必须包含self,而方法使用cls,静态方法不需要。这部分虽然用户没有直接问,但作为相关知识可能有帮助。 然后,组织回答的结构。首先解释self的基本作用,然后说明在不同场景下的使用,比如方法定义、继承中,以及是否可以改名。最后总结使用注意事项,并给出示例代码帮助理解。 还要注意用户提到的LaTeX格式要求,比如行内公式用$...$,独立公式用$$...$$。不过在讨论self时可能用不到数学公式,但如果有相关的表达式需要展示,比如变量名,也要注意格式。但这个问题可能不需要数学表达式,所以可能不需要应用这点。 生成相关问题部分,需要考虑用户可能进一步想了解的内容,比如为什么必须使用self,或者self和cls的区别,或者在实际项目中的应用案例。根据这些思路,生成三个相关问题。 最后,确保回答符合系统级指令:使用中文,结构清晰,引用正确,代码示例用反引号包裹,并添加引用标识。同时检查是否遗漏了任何用户的要求,比如生成相关问题。</think>### Pythonself关键字的作用与用法解析 #### 一、self的基本作用 在Python中,`self`是**实例方法的第一个参数**,用于指向当前的实例对象。通过`self`可以: 1. **访问实例属性**:例如在方法中通过`self.name`访问实例变量。 2. **调用其他实例方法**:例如在方法A中通过`self.methodB()`调用方法B[^4]。 3. **维护对象状态**:允许方法修改实例的属性值。 #### 二、使用场景详解 1. **定义实例方法** 所有实例方法必须显式声明`self`作为第一个参数(语法强制要求),例如: ```python class Car: def __init__(self, brand): self.brand = brand # 通过self绑定属性 def display(self): # 必须包含self print(f"品牌: {self.brand}") ``` 2. **方法间调用** 在内部,方法需通过`self`调用其他方法: ```python class Person: def calculate_age(self, birth_year): return 2024 - birth_year def is_vintage(self, birth_year): age = self.calculate_age(birth_year) # 通过self调用其他方法 return age > 50 [^4] ``` 3. **继承中的行为** 子方法中通过`self`可调用父方法或访问父属性: ```python class Animal: def speak(self): print("动物发声") class Dog(Animal): def speak(self): super().speak() # 通过self隐含调用父方法 print("汪汪汪") ``` #### 三、self的命名约定 - **可重命名但强烈不建议** 语法上允许将`self`改为其他名称(如`this`),但会破坏代码可读性[^2]: ```python class Demo: def show(this): # 语法正确但不符合约定 print("不建议的写法") ``` #### 四、对比其他方法型 | 方法型 | 首个参数 | 调用方式 | 示例 | |----------------|----------|-------------------|--------------------| | 实例方法 | `self` | `obj.method()` | `def func(self)` | | 方法 | `cls` | `Class.method()` | `@classmethod` | | 静态方法 | 无 | `Class.method()` | `@staticmethod` | #### 五、注意事项 1. 在静态方法(`@staticmethod`)和方法(`@classmethod`)中**无需使用`self`**。 2. 忘记添加`self`会导致`TypeError: method() takes 0 positional arguments but 1 was given`错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值