Python 中的实例变量和实例方法

发布: (2026年2月20日 GMT+8 17:29)
10 分钟阅读
原文: Dev.to

Source: Dev.to

Python 中的实例变量和实例方法

在面向对象编程(OOP)中,实例变量(instance variables)和 实例方法(instance methods)是最常用的概念之一。本文将通过简洁的示例帮助你理解它们在 Python 中是如何工作的,以及它们之间的区别。


什么是实例变量?

实例变量是与类的每个实例(对象)关联的属性。它们存储在对象的 __dict__ 中,并且每个对象可以拥有不同的值。

class Person:
    def __init__(self, name, age):
        self.name = name      # 实例变量
        self.age = age        # 实例变量
  • self.nameself.age 只在当前对象上有效。
  • 当创建多个 Person 对象时,每个对象都有自己的 nameage
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1.name)  # 输出: Alice
print(p2.name)  # 输出: Bob

什么是实例方法?

实例方法是定义在类内部、并且第一个参数默认是 self 的函数。它们可以访问和修改实例变量。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"Hello, my name is {self.name} and I'm {self.age} years old.")
  • greet 是一个实例方法。
  • 调用时必须通过对象实例来触发,Python 会自动把实例本身传递给 self 参数。
p = Person("Charlie", 22)
p.greet()  # 输出: Hello, my name is Charlie and I'm 22 years old.

实例变量 vs 类变量

有时我们会在类体中直接定义变量,这些变量称为 类变量(class variables),它们在所有实例之间共享。

class Dog:
    species = "Canis familiaris"   # 类变量

    def __init__(self, name):
        self.name = name           # 实例变量
  • species 对所有 Dog 实例都是相同的。
  • self.name 则是每只狗的独有属性。
d1 = Dog("Buddy")
d2 = Dog("Max")

print(d1.species)  # 输出: Canis familiaris
print(d2.species)  # 输出: Canis familiaris

如果在实例上重新赋值,会遮蔽类变量:

d1.species = "Canis lupus"
print(d1.species)  # 输出: Canis lupus   (实例属性)
print(d2.species)  # 输出: Canis familiaris (仍然是类属性)

常见错误示例

  1. 忘记使用 self

    class Car:
        def __init__(self, make):
            make = make   # ❌ 这里没有使用 self,导致实例属性未被创建
  2. 在实例方法中直接访问类变量

    class Counter:
        total = 0
    
        def increment(self):
            self.total += 1   # 这会创建一个新的实例属性,而不是修改类变量

    正确做法:

    class Counter:
        total = 0
    
        def increment(self):
            Counter.total += 1   # 直接通过类名访问类变量

小结

  • 实例变量:使用 self.<name> 定义,属于具体对象。
  • 实例方法:第一个参数必须是 self,可以访问/修改实例变量。
  • 类变量:在类体中直接定义,所有实例共享;如果在实例上重新赋值,会产生遮蔽效果。

掌握这些概念后,你就能在 Python 中更自如地使用面向对象的特性,编写出结构清晰、易于维护的代码。祝你编码愉快!

Python中的实例变量和实例方法

在面向对象编程(OOP)中,你必须掌握的两个概念是:

  • 实例变量
  • 实例方法

如果这些概念不清楚,OOP 总会让人感到困惑。让我们一步一步以最简单的方式拆解。


现实生活类比

= 教室的蓝图(老师)。
对象 = 学生。

每个学生:

  • 有一个 名字
  • 有一个 学号
  • 成绩
  • 能够 执行动作(提交作业、参加考试等)

即使所有学生都来自同一个类,每个学生都有 自己的数据

  • 那些“自己的数据” = 实例变量
  • 他们执行的动作 = 实例方法

什么是实例方法?

实例方法是属于对象的函数,并且作用于该特定对象。

定义(简明版)

  • 类内部 定义
  • 第一个参数为 self
  • 可以 访问和修改 实例变量

为什么需要 self

当我们从一个类创建多个对象时,每个对象都有自己的数据。
self 告诉 Python “使用当前调用该方法的对象”。

示例

class User:
    def activate(self):
        self.is_active = True
user1 = User()
user2 = User()

调用方法:

user1.activate()

Python 实际执行的是:

User.activate(user1)   # self == user1

因此,实例方法始终作用于调用它们的对象

什么是实例变量?

实例变量是属于 特定对象 的变量。
它通过给 self 的属性赋值来创建:

self.variable_name = value

关键点

  • 存储数据
  • 对每个对象 唯一
  • 存在于 对象内部

示例

def set_email(self, email):
    self.email = email
user1.set_email("shameel@hasabtech.com")

调用后:

user1.email = "shameel@hasabtech.com"

email 现在 属于 user1
user2 仍然没有 email 属性,除非我们为它设置。


完整示例及深入解释

class User:
    def activate(self):
        self.is_active = True

    def deactivate(self):
        self.is_active = False

    def set_email(self, email):
        self.email = email

    def show_status(self):
        print(f"{self.email} is {'active' if self.is_active else 'not active'}")

步骤 1 – 创建对象(实例)

user1 = User()
user2 = User()
  • Python 在内存中创建两个独立的对象
  • 每个对象都有自己的空间来存放数据。
  • 两个对象都可以使用所有实例方法

注意: Object(对象)和 instance(实例)是同义词。

内存中到底发生了什么?

虽然 user1user2 共享同一个类蓝图,但它们的实例变量拥有独立的存储。这些变量不共享

使用实例方法

user1.set_email("shameel@hasabtech.com")
  • Python 会自动把 user1 作为 self 传入。
  • 在方法内部,self.email = email 实际上等价于 user1.email = "shameel@hasabtech.com"

此时:

  • user1 拥有 email 属性。
  • user2 仍然没有该属性。

添加更多数据

user1.activate()
user2.deactivate()

得到的属性:

user1.is_active = True
user2.is_active = False

每个对象的 is_active 标志相互独立,这正体现了实例变量的核心概念。

为什么叫 实例 方法?

  • 它们操作实例变量
  • 它们的行为取决于调用它们的对象
  • 它们使用 self 来访问该对象的数据。
def show_status(self):
    print(f"{self.email} is {'active' if self.is_active else 'not active'}")

调用 user1.show_status() 会打印 user1 的状态,而 user2.show_status()(在设置了 emailis_active 之后)会打印 user2 的状态。

常见初学者困惑

self 是关键字吗?
不是。self 只是一种 命名约定。你可以把它命名为任何名字:

def activate(myobject):
    myobject.is_active = True

然而,按照约定,实例方法的第一个参数总是叫做 self


为什么这个概念至关重要

理解实例变量和实例方法可以让你:

  • 构建登录系统
  • 创建用户管理工具
  • 设计任何需要 多个独立对象 各自拥有数据和行为的应用

掌握这些基础,面向对象编程就不再令人困惑!

Ment Systems

  • 理解 Django 模型
  • 使用 API
  • 设计真实世界的应用

如果不理解 self,面向对象编程会显得复杂。


最终理解

Whenever:

  • 你使用 self 附加数据 → 它会成为一个 instance variable
  • 你使用 self 定义方法 → 它会成为一个 instance method

Each object:

  • 拥有自己的数据。
  • 共享方法结构。
  • 独立行为。

摘要

  • Object = Instance – 它们的含义相同。
  • Instance variables 是描述对象的“形容词”(数据)。
  • Instance methods 是对象可以执行的“动词”(行为)。
  • self 是连接方法与特定对象数据的桥梁。
  • 每个对象都有自己的一份实例变量副本。

关注 hasabTech 获取更多信息

Website | Facebook | LinkedIn | YouTube | X (Twitter) | TikTok

0 浏览
Back to Blog

相关文章

阅读更多 »