0. 属性和变量
- 不同点
1. 概念 (1) 变量是操作存储在内存中的对象的外部接口 (2) 属性是属于某个对象的特征 2. 访问权限 (1) 变量:根据不同的位置,存在不同的访问权限 (2) 属性:只能通过对象来进行访问,必须先找到对象; 对象是通过变量名来引用,既然是变量,也有对应的访问权限
- 相同点
1. 都是通过一个变量引用内存中的一个对象 2. 被引用的对象,可以是数据,也可以是函数实现
- 判定依据:是否存在
归属对象
1. 对象属性
- 增
1. 直接通过实例对象,动态添加 (1) 语法: 实例对象.属性 = 值 (2) 示例: class Person: pass p = Person() p.name = "wxx" p.age = 18
2. 通过类的构造方法,__init__ 方法 class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("wxx", 18)
- 查
1. 语法: 实例对象.属性 2. 示例: class Person: pass p = Person() p.name = "wxx" print(p.name) 3. 查看实例对象所有属性 class Person: pass p = Person() p.name = "wxx" p.age = 18 p.height = 1.88 print(p.__dict__)
- 改
1. 和增加属性操作一样,系统会自动识别,不存在则新增,存在则修改 2. 语法: 实例对象.属性 = 值 3. 示例: class Person: pass p = Person() p.age = 16 p.age = 18 print(p.age)
- 删
1. 语法: del 实例对象.属性 2. 示例: class Person: pass p = Person() p.age = 18 del p.age print(p.age)
-
底层简述
2. 类属性
- 增
1. 类对象.属性 = 值 class Person: pass Person.count = 100 2. 在类对象里面直接添加属性 class Person: count = 100
- 查
1. 通过类对象访问:类对象.属性 class Person: count = 100 print(Person.count)
2. 通过实例对象访问:实例对象.属性 class Person: count = 100 p = Person() print(p.count)
3. 查看类对象所有属性 class Person: count = 100 sex = "male" print(Person.__dict__)
4. 属性查找机制 (1) 先到实例对象中查找属性, 找到则结束 (2) 如果没有找到, 则根据 __class__ 找到实例对象对应的类对象, 到这个类对象里面查找
- 改
1. 类对象.属性 = 值 class Person: count = 100 Person.count = 1000 print(Person.count) 2. 系统会自动识别,不存在则新增,存在则修改
- 删
1. 通过类对象删除:del 类对象.属性 class Person: count = 100 del Person.count print(Person.count)
-
底层简述
3. 属性存储
- 实例对象
1. 一般情况下, 对象属性存储在实例对象的 __dict__ 属性中; 2. 有些内置对象没有 __dict__ 属性; 3. 一般情况下, 实例对象可以直接修改 __dict__ 属性 class Person: pass p = Person() p.__dict__ = {"name": "wxx", "age": 18} print(p.name, p.age)
- 类对象
1. 一般情况下, 类属性存储在类对象的 __dict__ 属性中; 2. 类对象的 __dict__ 属性为只读, 默认无法修改 3. 可以通过 setattr 方法修改类对象的 __dict__ 属性 class Person: count = 100 sex = "male" Person.__dict__["money"] = 1000 print(Person.money)
-
底层简述
4. 属性限制
- 概念:通过设置
__slots__
类属性, 来限制对象属性
1. __slots__ 属性是一个列表; 2. 列表中的元素, 就是通过这个类对象创建的实例对象可以添加的对象属性; 3. 如果这个类实例出的对象,添加非列表之内的属性,则会报错 class Person: __slots__ = ["name", "age", "address"] p = Person() p.name = "wxx" p.age = 18 p.address = "杭州市" p.sex = "male"