0Pricing
Python Academy · 课时

实例方法与 self

编写操作对象自身数据的方法。

实例方法与 self 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。

简介

实例方法操作特定对象的数据,并使用 self 访问和修改该对象的属性。

定义实例方法

类中的 def method(self): 是实例方法。它会将对象作为第一个实参(self)接收。
class Circle:
    def __init__(self, r): self.r = r
    def area(self):
        import math
        return math.pi * self.r**2
print(Circle(5).area())

调用方法

obj.method() 是 ClassName.method(obj) 的语法糖。Python 会自动将 obj 作为 self 传入。
class Dog:
    def __init__(self, name): self.name = name
    def bark(self): print(f'{self.name} says Woof!')
Dog('Rex').bark()

返回 self 的方法

返回 self 可以实现方法链式调用:builder.set_name('x').set_age(3).build()。
class Builder:
    def __init__(self): self.data = {}
    def set(self, k, v):
        self.data[k] = v
        return self
    def build(self): return self.data
result = Builder().set('x',1).set('y',2).build()
print(result)

私有方法(约定)

使用 _ 前缀表示“内部使用”。使用 __ 前缀会触发名称改写:_ClassName__method。
class Account:
    def __init__(self, bal): self._bal = bal
    def _validate(self, amount): return amount > 0
    def deposit(self, amount):
        if self._validate(amount):
            self._bal += amount
a = Account(100)
a.deposit(50)
print(a._bal)

将属性用作方法

@property 会将方法转换为可直接读取的属性。访问时不需要括号。
class Circle:
    def __init__(self, r): self.r = r
    @property
    def diameter(self): return self.r * 2
c = Circle(5)
print(c.diameter)  # no ()

改变状态

修改 self 属性的方法会改变对象的状态。请明确设计方法的意图:区分查询与命令。
class Stack:
    def __init__(self): self.items = []
    def push(self, x): self.items.append(x)
    def pop(self): return self.items.pop()
    def peek(self): return self.items[-1]
s = Stack()
s.push(1); s.push(2)
print(s.pop(), s.peek())

比较对象

默认情况下,== 比较对象标识。实现 __eq__ 可以按值进行比较。
class Point:
    def __init__(self, x, y): self.x,self.y=x,y
    def __eq__(self, other): return self.x==other.x and self.y==other.y
print(Point(1,2)==Point(1,2))

迭代协议

实现 __iter__ 和 __next__ 可以让类支持迭代,从而用于 for 循环。
class Countdown:
    def __init__(self, n): self.n = n
    def __iter__(self): return self
    def __next__(self):
        if self.n <= 0: raise StopIteration
        self.n -= 1; return self.n + 1
print(list(Countdown(3)))

上下文管理器协议

实现 __enter__ 和 __exit__ 可以让类用于 with 语句。
class Timer:
    def __enter__(self):
        import time
        self.start = time.time()
        return self
    def __exit__(self, *args):
        import time
        print(f'elapsed: {time.time()-self.start:.3f}s')
with Timer(): pass

方法与函数

通过类访问时,Dog.bark 是普通函数。通过实例访问时,d.bark 是绑定方法,self 已预先填入。
class Dog:
    def bark(self): print('woof')
print(type(Dog.bark))
print(type(Dog().bark))

快速检查

什么是方法链式调用?方法必须返回什么才能支持它?

回顾

实例方法:def m(self)。调用方式为 obj.m()。返回 self 以支持链式调用。__eq__/__iter__/__enter__/__exit__ 用于实现协议。使用 _ 前缀表示内部使用。

继续学习

太棒了!请继续下一课,以进一步提升您的技能。

常见问题解答

「实例方法与 self」课时是免费的吗?

是的 — 「实例方法与 self」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。

「实例方法与 self」这节课中我会学到什么?

编写操作对象自身数据的方法。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「实例方法与 self」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Python Academy 课中编写并运行代码吗?

能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类与 __init__ 方法
  2. 实例属性与类属性
  3. 实例方法与 self
  4. 魔术方法:__str__ 与 __repr__
← 返回 Python Academy