面向对象
一、面向过程和面向对象
1、面向过程编程(思想)
1.上一个函数的输出是下一个函数的输入,类似流水线,机械式、顺序化
2.优点:逻辑清晰,将复杂的问题流程化,细化、步骤化,进而简单化
3.缺点:可扩展性差
2、面向对象编程(思想)
1.对象:特征和技能的结合体
2.优点:可扩展性强
3.缺点:逻辑复杂
二、类与对象
1.类(类别):一系列具有相同特征和技能的对象
2.现实世界中是先有对象,后有类
# 比如现实世界中,先发现了各种各样的生物,才由人类去将这些生物分类为:非细胞生物、原核生物、真核生物。
# 再细分可以分成:动物、植物、微生物(包含细菌、真菌、病毒等等)...
# 比如一个学校中的老师和学生:可以将他们分在同一个学校类中...
3.python中先有类,再有对象
# 如何定义一个类
# 类名用驼峰体。定义类时,会直接运行类中的代码(但是里面的函数也属于定义阶段,并不会直接运行)
class 类名:
# 定义一系列特征
school = 'oldboy'
# 定义一系列方法
def choose(self,course):
print('math')
# 通过类实例化一个具体对象(类是抽象的)
对象 = 类名()
三、给对象定制独有的特征
1.对象本质近似于类,也是一个名称空间,但是对象的名称空间存放对象独有的属性,而类中存放的时对象们共有的属性
# 定义一个动物类
class Animal:
anything_attribute = 'animal'
count = 0
def __init__(self,character,height,weight):
self.character = character
self.height = height
self.weight = weight
Animal.count += 1
def habit(self,food):
print(f'{self.character} ent {food}')
# 实例化一个动物对象
people = Animal('person',180,68)
print(people.__dict__)
people.habit('rice')
'''
{'character': 'person', 'height': 180, 'weight': 68}
person ent rice
'''
# 实例化第二个动物对象
purp = Animal('dog',60,30) # purp 是小狗的意思
print(purp.height)
purp.habit('bone')
'''
60
dog ent bone
'''
# 每定义一个实例对象,都会自动调用__init__()
print(Animal.count) # 2
四、对象的属性查找顺序
先从对象本身开始查找,如果没有就去类中找,类中没有则会报错
class Animal:
anything_attribute = 'animal'
def __init__(self,character,height,weight):
self.character = character
self.height = height
self.weight = weight
def habit(self,food):
print(f'{self.character} ent {food}')
people = Animal('person',180,68)
print(people.anything_attribute) # animal
五、类与对象的绑定方法
1.类名称空间中定义的数据属性和函数属性都是共享给所有对象共同使用的
2.对象名称空间中定义的只有数据属性,而且是该对象所独有的
3.注意:类中定义的函数,如果是类来使用,则需要按照函数的参数规则传值,是几个参数,就传几个;而如果是实例化了的对象来使用,则只需要传除 self 参数之外的参数。因为 self 就是对象本身
class person:
def habit(self):
print(f'ent rice')
person.__dict__['habit']('jojo') # ent rice
六、类与数据类型
list其本质就是一个类,我们可以通过列表调用它内部的许多方法,且定义出来的列表对象之间,进行方法调用时,互不影响
# 演示list就是类
l1 = list([1,2,3,4])
# list()中有append()方法
list.__dict__['append'](l1,5)
print(l1) # [1, 2, 3, 4, 5]
lis1 = list([1,2,3])
lis2 = list([1,2,3])
list.append(lis2,4)
print(lis1) # [1, 2, 3]
print(lis2) # [1, 2, 3, 4]
七、对象的高度整合
对象会有一大堆属性/数据,还会有一大堆方法来操作这些属性,然后对于不同的对象,这些属性又不同