day 19
目录
1. 面向对象思想
什么是面向对象?
面向对象是一种编程思想。
-
面向过程编程
核心是“过程”二字,过程指的是做事情的步骤,即先做什么,然后做什么,最后做什么。
基于该编程思想编写程序,就类似于一条工厂流水线,一种机械式的思维方式。
-
优点
逻辑清晰,将复杂的问题流程化,进而简单化。
-
缺点
可扩展性差。
-
-
面向对象编程
核心是“对象”二字,对象指的是特征与技能的结合体。
基于该编程思想编写程序,就类似于在创造世界,一种上帝式的思维方式。
-
优点
可扩展性高。
-
缺点
编写程序的复杂程度要远高于面向过程编程思想。
-
优先使用面向过程还是面向对象?
实际编程中需要面向过程结合面向对象一起使用
2. 类和对象
2.1 类和对象的定义
-
什么是对象
特征和技能的结合体。
-
什么是类
一系列对象相同的特征与技能的结合体。
2.2 类和对象的产生
-
在现实世界中
对象是一个个具体存在的事物,类是由人类文明的发展抽象总结出来的。
-
在程序中
必须遵循,先有类,再由对象。
2.3 在现实世界中定义类和对象
现实世界中,现有对象,后有类。
现实中的猫对象:
- 猫对象1
- 特征
- 属性:萌
- 品种:橘猫
- 年龄:2
- 体重:10
- 技能
- 抓老鼠
- 爬树
- 特征
- 猫对象2
- 特征
- 属性:萌
- 品种:狸花
- 年龄:5
- 体重:7
- 技能
- 抓老鼠
- 爬树
- 特征
根据对象抽象出类:
- 猫类
- 相同的特征
- 属性:萌
- 相同的技能
- 抓老鼠
- 爬树
- 相同的特征
2.4 在程序中定义类
程序中先定义类,再产生对象。
2.4.1 语法
class 类名:
对象相同的特征
对象相同的技能
# class: 用来定义类的,class后跟的是类名。
# 类名: 类的名字,用来调用创造对象的。
# 注意: 类名必须要遵循驼峰命名法,python在定义变量与函数时不推荐使用,但在定义类时推荐使用。
定义类时发生的事情:
-
类在定义时,会产生一个类的名称空间
-
类内部的所有名字,都会存进名称空间
注意:类在定义阶段已经产生好了名称空间,执行python文件时会执行类内部的代码
-
定义一个类:
class Cat:
att = 'cute'
def catch(self):
print('catch mouse.')
def climb(self):
print('climb up a tree.')
2.4.2 类的操作
-
查看类的名称空间内所有名字
print(Cat.__dict__)
运行结果:
{'__module__': '__main__', 'att': 'cute', 'catch': <function Cat.catch at 0x0000027ED1EB28C8>, 'climb': <function Cat.climb at 0x0000027EE0F3FB70>, '__dict__': <attribute '__dict__' of 'Cat' objects>, '__weakref__': <attribute '__weakref__' of 'Cat' objects>, '__doc__': None} Process finished with exit code 0
-
查
print(Cat.att)
运行结果:
cute
-
改
Cat.att='lovely' print(Cat.att)
运行结果:
lovely Process finished with exit code 0
-
增
Cat.master='tom' print(Cat.master)
运行结果:
tom Process finished with exit code 0
-
删
Cat.master='tom' print(Cat.master) del Cat.master print(Cat.master)
运行结果:
tom Traceback (most recent call last): File "D:/data/python/Learn/courses/day19/01 课程内容/代码/1 类.py", line 53, in <module> print(Cat.master) AttributeError: type object 'Cat' has no attribute 'master' Process finished with exit code 1
2.5 在程序中定义对象
2.5.1 语法
类名 + () 调用类产生对象。
定义对象发生的事情:
-
产生一个空的对象的名称空间
-
会自动触发
__init__
-
把对象本身以及括号内的参数一并传给
__init__
函数总结:调用类会产生一个对象,调用类的过程叫做类的实例化,产生的对象称之为类的一个实例。
实例化一个对象:
# 定义一个类
class Cat:
att = 'cute'
def catch(self):
print('catch mouse.')
def climb(self):
print('climb up a tree.')
# 实例化对象
cat1 = Cat()
cat2 = Cat()
# 查看对象属性
print(cat1.att)
cat1.catch()
cat1.climb()
print(cat2.att)
cat2.catch()
cat2.climb()
运行结果:
cute
catch mouse.
climb up a tree.
cute
catch mouse.
climb up a tree.
Process finished with exit code 0
2.5.2 定制对象独有的特征
方法:类定义阶段定制属性,使用 __init__
函数。
# 定义类
class Cat:
def __init__(self, att, variety, age, weight):
self.att = att
self.varieties = variety
self.age = age
self.weight = weight
def catch(self):
print('catch mouse.')
def climb(self):
print('climb up a tree.')
# 实例化对象时传特征
cat1 = Cat('cute', 'Orange Cat', 3, 10)
cat2 = Cat('lovey', 'Dragen-Li', 2, 6)
print(cat1.att, cat1.varieties, cat1.age, cat1.weight)
print(cat2.att, cat2.varieties, cat2.age, cat2.weight)
运行结果:
cute Orange Cat 3 10
lovey Dragen-Li 2 6
Process finished with exit code 0
3. 对象与类的查找顺序
对象与类的查找顺序:
- 对象的属性,若对象本身有,则查找对象自己具有的属性。
- 若对象本身不具备该属性,则去类里面找,若类也没有,则报错。
4. 对象的绑定方法
4.1 对象的绑定方法
class Cat:
def __init__(self, name, att, variety, age, weight):
self.name = name
self.att = att
self.varieties = variety
self.age = age
self.weight = weight
def catch(self):
print(f'{self.name}catch mouse.')
def climb(self):
print('climb up a tree.')
- 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
- 对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性
4.2 类使用对象的绑定对象
cat1 = Cat('lucky', 'cute', 'Orange Cat', 3, 10)
cat2 = Cat('ball', 'lovey', 'Dragen-Li', 2, 6)
print(cat1.name)
print(cat2.name)
运行结果:
lucky
ball
Process finished with exit code 0
- 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
4.3 对象使用对象的绑定方法
print(id(cat1.climb))
print(id(cat2.climb))
print(id(Cat.catch))
cat1.catch()
cat2.catch()
运行结果:
1503122635976
1503122635976
1501259299696
lucky catch mouse.
ball catch mouse.
Process finished with exit code 0
- 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
- 绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入