python 实例属性和类属性

本文深入探讨了Python中类属性的可变性与不可变性,通过实例展示了如何修改类属性,强调了使用类本身修改类属性的重要性,并提供了避免混淆实例与类属性的方法。
#类的可变类型的属性,通过实例可以修改
class C2():
    x = [1, 2, 3]
    y = 'gary'
c2 = C2()
print c2.x
print C2.x
c2.x += [4, 5]
print C2.x
print c2.x

#类的不可变类型的属性,无法通过实例修改
c2.y = 'kevin'
print c2.y, C2.y
#另外一个C2实例
c22 = C2()
print c22.y

输出结果:[1, 2, 3][1, 2, 3][1, 2, 3, 4, 5][1, 2, 3, 4, 5]kevin garygary

(1) 类属性具有持久性,即多个实例访问到的类属性是不变的

(2) 使用类本身修改类属性,使用实例修改类属性是很危险的,简单的说就是,如果通过实例修改类属性情况复杂,可能是创建实例的属性,可能修改类属性. 因此,修改类属性时要使用类,名,而非实例名.

### Python 实例属性类属性的区别及使用场景 #### 一、基本概念 在 Python 中,类属性实例属性是两种不同类型的属性,分别属于类其实例。 - **类属性** 是由类本身拥有并共享给所有实例的属性[^1]。它通常用于存储与整个类相关的数据。 - **实例属性** 则是由每个具体的对象单独拥有的属性[^1]。这些属性只对该实例有效。 #### 二、定义方式 ##### 类属性 类属性是在类内部但在任何方法之外定义的变量。例如: ```python class MyClass: class_attribute = "I am a class attribute" ``` ##### 实例属性 实例属性通常是通过 `__init__` 方法初始化,并绑定到每个实例上的变量。例如: ```python class MyClass: def __init__(self, value): self.instance_attribute = value ``` #### 三、访问方式 - 访问类属性可以通过类名或者实例名实现。如果通过实例访问,则会优先查找实例属性,找不到时才会去查找类属性[^2]。 - 实例属性只能通过实例名称访问。 示例代码如下: ```python class Person: species = "Homo sapiens" # 类属性 def __init__(self, name): self.name = name # 实例属性 p1 = Person("Alice") p2 = Person("Bob") print(p1.species) # 输出 Homo sapiens (通过实例访问类属性) print(Person.species) # 输出 Homo sapiens (通过类名访问类属性) print(p1.name) # 输出 Alice (实例属性) print(p2.name) # 输出 Bob (实例属性) ``` #### 四、修改行为 - 修改类属性会影响所有实例,因为它是全局共享的[^3]。 - 修改实例属性只会改变当前实例的状态,不会影响其他实例或类本身的属性。 示例代码如下: ```python class Counter: count = 0 # 类属性 c1 = Counter() c2 = Counter() Counter.count += 1 # 使用类名修改类属性 print(c1.count) # 输出 1 print(c2.count) # 输出 1 c1.count += 1 # 创建了一个新的实例属性覆盖了原来的类属性 print(c1.count) # 输出 2 (这是 c1 的实例属性) print(c2.count) # 输出 1 (仍然是类属性) ``` #### 五、适用场景 - **类属性**:当某个值在整个类范围内保持一致且不随实例变化时,适合使用类属性。比如常量、计数器等。 - **实例属性**:当需要保存每个对象独立的数据时,应使用实例属性。这有助于区分各个对象的不同状态。 --- ### 总结表格对比 | 特性 | 类属性 | 实例属性 | |-------------------|----------------------------------|------------------------------| | 定义位置 | 类体外部 | 初始化函数 (`__init__`) | | 所属范围 | 属于类 | 属于单个实例 | | 是否共享 | 被所有实例共享 | 各自独立 | | 修改的影响 | 影响所有实例 | 只影响单一实例 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值