0Pricing
Python Academy · 课时

实例属性与类属性

区分每个对象独有的数据与类级别共享的数据。

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

简介

理解实例属性与类属性之间的区别,可以避免难以察觉的错误,并实现高效的共享状态。

类属性

class Dog: legs = 4 — legs 由所有实例共享。可以通过 Dog.legs 或 dog.legs 访问。
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

实例属性

在 __init__ 中使用 self.name = name 表示该属性属于每个实例。每个 Dog 都有自己的名称。
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

属性查找顺序

Python 会先检查实例的 __dict__,再检查类的 __dict__,最后检查基类。实例属性会遮蔽类属性。
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

可变类属性陷阱

class C: items = [] — ALL 实例共享同一个列表。在一个实例上追加内容会影响所有实例!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

解决可变属性陷阱

将初始化移到 __init__ 中:def __init__(self): self.items = [] 每个实例都会获得自己的列表。
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

检查 __dict__

obj.__dict__ 是实例属性字典。Class.__dict__ 是类属性字典。
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

将类方法用作工厂

@classmethod 接收 cls(即类本身),而不是 self。可以将其用作替代构造方法。
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

静态方法

@staticmethod 不需要 self 或 cls。对于逻辑上属于某个类、但不需要实例或类本身的实用函数,可以使用它。
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

使用类属性跟踪实例

将类属性用作计数器,可以跟踪已经创建的实例数量。
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() 与 vars()

hasattr(obj, 'name') 会检查属性是否存在。vars(obj) 与 obj.__dict__ 等价。
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

快速检查

从实例向可变类属性列表中追加内容时会发生什么?

回顾

类属性由所有对象共享;实例属性则属于各自的对象。实例属性会遮蔽类属性。请在 __init__ 中初始化可变对象。使用 @classmethod 定义工厂方法。

继续学习

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

常见问题解答

「实例属性与类属性」课时是免费的吗?

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

「实例属性与类属性」这节课中我会学到什么?

区分每个对象独有的数据与类级别共享的数据。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Python Academy 需要有经验吗?

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

「实例属性与类属性」课时需要多长时间?

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

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

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

此课程中的所有课时

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