实例方法与 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 反馈 — 无需本地设置。