面向对象在Python中的实践
如何定义一个类?
【基本语法】
class 类名:
pass
class Money:
pass
类名首字母大写,后不用跟小括号;pass:空语句
#经典类
#新式类
怎样通过类,创建出一个对象?
根据类Money 创建(实例化)一个对象Money()
-
one = Money()
把对象赋值给变量,此时one是对象
-
Money既是一个变量名称;也是类的名称。
-
执行流程
-
类的定义
-
根据类,创建出一个对象
-
将对象的唯一标识返回
属性相关
属性和变量的区别及判定依据?
-
区别
-
概念
- 变量是“可以改变的量值”
- 属性是“属于某个对象的特性”(也可以改)
-
访问权限
-
变量:根据不同的位置,存在不同的访问权限 eg:全局变量、局部变量…
-
属性:只能通过对象来进行访问,所以,必须先找到对象;
对象也是通过变量名来引用;而既然是变量,也有对应的访问权限
-
-
-
判定依据:是否存在宿主
变量可以直接写,对象的属性要是"对象.属性"。
根据宿主的不同,属性分为两大类:
-
对象属性
p = Money()
-
怎样让一个对象拥有一些属性?(增)
-
直接通过对象,动态添加
语法: 对象.属性 = 值
p.age = 18
-
通过类的初始化方法(构造方法)
__init__方法
-
-
-
怎样访问一个对象的属性?(查)
- 一般访问: 对象.属性
print(p.age)
- 如果访问不到 会直接报错-----需要记住错误提示
AttributeError
- 一般访问: 对象.属性
-
怎样修改一个对象的属性?(改)
-
同新增一样;系统会自动识别,不存在则新增,存在则修改
-
语法:对象.属性 = 值
p.age = 123
-
age、height真正存储位置在对象里的dict属性里(后面类属性部分)。
-
-
怎样删除一个对象的属性?(删)
- del 对象.属性
del p.age
- del 对象.属性
-
补充
- 查看对象的所有属性: 对象._dict_
-
-
类属性
-
万物皆对象,类也是一个对象
one = Money
one._class_=Test # 更改one的类
-
怎样让一个类拥有属性?(增)
-
方式1: 类名.类属性 = 值
-
方式2: 类里面写“变量名 = 值”即可
class Dog:
dogCount = 0
-
-
怎样查询一个类的属性?(查)
-
通过类访问: 类名.类属性
-
通过对象访问: 对象.类属性
-
注意:为什么可以通过对象访问到类属性?
答:和Python对象的属性查找机制有关:优先到对象自身去查找属性, 找到则结束;
如果没有找到, 则根据__class__找到对象对应的类, 到这个类里面查找。
-
-
怎样修改一个类的属性?(改)
- 通过类名改:语法如同给类增加一个属性(方式1)系统也会自动检测,不存在,则新增;存在,则修改。 类名.属性 = 值
- 能否通过对象改?----不能!
-
怎样删除一个类的属性?(删)
- 通过类名删除:del 类名.属性
- 能否通过对象删除? 不能! del 语句只删除直系属性。
-
注意1:类属性的内存存储问题。
-
一般情况下,属性存储在__dict__的字典当中。通过变量访问的属性访问的就是对象里面dict属性里字典的值。
但有些内置对象没有这个__dict__属性。
-
一般对象可以直接修改__dict__属性
-
但类对象的__dict__属性为只读,默认无法修改;
可以通过setattr方法修改
-
-
注意2:类属性被各个对象共享 ---- 类属性修改之后,所有的对象访问到的类属性都会跟着修改。
-
(补充)查看一个类的所有属性:类名._dict_
-
-
对象属性和类属性之间的区别联系?
存储不同、抽象层级不同、宿主不同
-
案例考察
-
类
class Person:
count = 1 -
对象
p = Person()
-
p.count += 1 代码执行之后,Person.count 与 p.count 打印的结果分别是多少?
Person.count=1; p.count=2
p.count += 1
==> p.count[新增] = p.count[查询] +1?为什么第一个是新增不是修改:判定新增还是修改判断依据是原来对象里有没有,之前对象p内没有所以是新增。
-
-
-
高级----如何限制对象添加的属性?
- 通过设置类属性:
__slots__
- __slots__属性是一个列表
- 列表中的元素,即为通过这个类创建出的对象可以添加的对象属性
- 如果这个类实例出的对象,添加了非列表之内的属性,则会报错
- 通过设置类属性: