1. 面向对象
世间万物皆对象
1.0 概述
类是一个抽象的概念,Python通过类来描述一类对象的特征(属性)和动作(方法)。
例如电脑,其特征有 CPU
,内存
,主板
,硬盘
,显卡
;其动作有 开机
,关机
,重启
。将这些特点提取出来并加以描述,就形成了一个 电脑类
类相当于模型,对象相当于用模型构建出来的具体事物
类通过实例化生成一个对象
开发中:类—>实例化—>对象
现实中:对象—>抽象,提取,封装—>类
1.1 定义格式
class 类名: # 类名 类的首字母大写,遵循驼峰命名法
类属性
.......
def 方法():
pass
.......
class Computer:
cpu = 'Intel Core i9-9900K'
memory = 'Kingston 16G*2 3200MHz'
gpu = 'Nvidia RTX 2080Ti'
disk = 'Samsung 970EVO Plus'
def POST(self):
print(self.cpu)
print(self.memory)
print(self.gpu)
print(self.disk)
pass
def turnOn(self):
self.POST()
print('正在启动计算机')
pass
def turnOff(self):
print('正在关机')
pass
pass
1.2 对象的创建与调用
创建一个对象时,会以类为模板进行创建,开辟新的内存空间。直到对对象作出修改前,这片内存空间是空的
对象的动态赋值:若对象中不存在指定的属性,则会在该对象的内存空间中动态添加(可以是类中不存在的属性)
内存空间为空为什么还能调用到属性值?
这与搜索原则有关:先找对象自身,对象自身没有则向类中找,类中没有则报错
类属性
:在类的空间中,既可以被类访问也可以被对象访问,在定义类的时候就被创建
对象属性
:在对象的空间中的属性,只能被当前的对象访问,在创建对象后才能创建,或使用 __init__
创建
class Computer:
cpu = 'Intel Core i9-9900K' # 类属性
pass
com1 = Computer() # 创建一个对象com1
print('Computer.cpu',id(Computer.cpu)) # 打印Computer.cpu的内存地址
print('com1.cpu-A\t',id(com1.cpu)) # 打印com1.cpu的内存地址
com1.cpu = 'i7-9750H' # 对象属性动态赋值com1.cpu
com1.gpu = 'RTX 2080Ti' # 对象属性动态赋值com1.gpu--该属性在类中不存在
print('com1.cpu-B\t',id(com1.cpu)) # 打印com1.cpu的内存地址
print(com1.gpu)
===========================
Computer.cpu 1574438452440
com1.cpu-A 1574438452440 # 未修改前的内存地址与类中的地址相同
com1.cpu-B 1574408438928 # 修改后地址改变
RTX 2080Ti # 可以访问到新添加的gpu属性值
1.3 创建对象时对象属性的创建方法
系统在某种条件下回自动触发的方法就被称为 魔术方法
无需程序员手动调用
如 __init__(self)
方法的触发条件就是 创建对象时
,功能类似构造函数,为对象创建对象属性。self表示对象自身
1.3.1 写死的方法
class Computer:
def __init__(self):
self.cpu = 'i9-9900K'
self.gpu = 'RTX 2080Ti'
pass
pass
com1 = Computer()
对象创建执行顺序:
- 找到Computer内存空间
- 参照Computer内存空间为com1开辟内存空间
- 找到魔术方法
__init__(self)
,执行魔术方法(self值为第2步给com1开辟的内存空间地址) - 开始在com1的内存空间中执行对象属性动态赋值
- 给com1对象赋值(把内存空间地址给com1)
1.3.2 通过参数创建的方法
class Computer:
def __init__(self,cpu,gpu):
self.cpu = cpu
self.gpu = gpu
pass
pass
com1 = Computer('i9-9900K','RTX 2080Ti')
对象创建执行顺序:
- 找到Computer内存空间
- 参照Computer内存空间为com1开辟内存空间
- 找到魔术方法
__init__(self,cpu,gpu)
,执行魔术方法 - 根据创建时传入的值在com1的内存空间中执行对象属性动态赋值
- 给com1对象赋值(把内存空间给com1)