目录
面向对象编程
面向过程编程
面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。
优点:复杂度的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)。
缺点:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
面向对象编程
面向对象的程序设计:核心是对象二字,对象是特征与技能的结合体,基于面向对象设计程序就好比在创造一个世界,你就是这个世界的上帝,存在的皆为对象,不存在的也可以创造出来,与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界的模拟,是一种“上帝式”的思维方式。
优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。。
缺点:编程的复杂度要高于面向过程。
类与对象
- 类:种类,分类,类别。
- 对象:特征与技能的结合体。
- 定义:类就是一系列对象相似的特征与技能的结合体。
现实世界中先有对象,后有类。
世界上肯定是先出现各种各样的实际存在的物体,然后随着人类文明的发展,人类站在不同的角度总结出了不同的种类,如人类、动物类、植物类等概念
也就说,对象是具体的存在,而类仅仅只是一个概念,并不真实存在
Python中先有类,再有对象。
类的定义与实例化
'''
class 类名驼峰体():
# 定义一系列特征
# 定义一系列方法
对象1 = 类名()
'''
# 定义一个PlayGame类
class PlayGame:
name = '英雄联盟'
# 操作类的属性
PlayGame.name = '王者荣耀'
# 实例化对象
player = PlayGame()
# 属性的访问
print(player.name)
# 操作对象属性属性, 只是更改了 player 名称空间中的 name 属性
player.name = '英雄联盟'
print(player.name)
给对象定制独有的特征
方式一:
class PlayGame:
game = '英雄联盟'
def choose_hero(self):
print('is choosing hero')
# 实例化对象:
hero1 = PlayGame()
# 为对象定制自己独有的特征
hero1.name = '无极剑圣'
方式二:
class PlayGame:
game = '英雄联盟'
def __init__(self,name):
self.name = name
def choose_hero(self):
print('is choosing hero')
hero1 = PlayGame('蛮王')
对象的属性查找顺序
class PlayGame:
game = '英雄联盟'
name = 'c'
def __init__(self,name,hero):
self.name = name
self.hero = hero
def choose_hero(self):
print('is choosing hero')
hero1 = PlayGame('a','剑圣')
hero1.game
hero2 = PlayGame('b','蛮王')
hero2.game
类与对象的绑定方法
什么是绑定方法
方法就是函数,面向对象编程中函数就是方法。绑定方法就是对象或类与函数进行绑定。
绑定方法有两种,一种是绑定给类的,一种是绑定给对象的。
为什么要绑定
对象本质上就是存放数据的容器,绑定方法就是将函数与数据绑定在一起,这个函数的功能就是处理数据。
# 类的绑定方法
class PlayGame:
game = '英雄联盟'
def __init__(self,name,hero):
self.name = name
self.hero = hero
@classmethod # 这就是一个类的绑定方法
def choose_hero(self):
print(f'{self.name} is choosing hero')
PlayGame.choose_hero()
# 对象的绑定方法
class PlayGame:
game = '王者荣耀'
def __init__(self, name, hero)
self.name = name
self.hero = hero
def choose_hero(self): # 绑定给对象的方法
print(f'{self.name} is choosing hero')
player = PlayGame('小明', '众星之子')
player.choose_hero()
非绑定方法
python给我提供了 @staticmethod ,可以解除绑定关系,将一个类中的方法变为一个普通的函数
class PlayGame:
name = '英雄联盟'
def __init__(self, name , hero):
self.name = name
self.hero = hero
@classmethod
def start_game(self):
print(f'{self.name} start')
def choose_hero(self):
print(f'{self.name} is choosing hero')
@staticmethod # 非绑定方法
def test_func(*args, **kwargs):
print('这是一个非绑定方法')
# 通过类调用非绑定方法
PlayGame.test_func()
# 通过对象调用非绑定方法
player = PlayGame('小红', '无极剑圣')
player.test_func()
# 结果
# 这是一个非绑定方法
# 这是一个非绑定方法
isinstance 与 issubclass
isinstance:判断一个 obj 是否是某个类 cls 的实例化对象
class Foo():
pass
f = Foo()
print(isinstance(f,Foo))
# True
issubclass:判断一个子类是否是一个父类的派生类
class A():
pass
class B(A):
pass
print(issubclass(B,A))
# True