面向对象编程

面向对象编程

面向过程编程

​ 面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。

优点:复杂度的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)。

缺点:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。

面向对象编程

​ 面向对象的程序设计:核心是对象二字,对象是特征与技能的结合体,基于面向对象设计程序就好比在创造一个世界,你就是这个世界的上帝,存在的皆为对象,不存在的也可以创造出来,与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界的模拟,是一种“上帝式”的思维方式。

优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。。

缺点:编程的复杂度要高于面向过程。

类与对象

  • 类:种类,分类,类别。
  • 对象:特征与技能的结合体。
  • 定义:类就是一系列对象相似的特征与技能的结合体。

现实世界中先有对象,后有类。

世界上肯定是先出现各种各样的实际存在的物体,然后随着人类文明的发展,人类站在不同的角度总结出了不同的种类,如人类、动物类、植物类等概念

也就说,对象是具体的存在,而类仅仅只是一个概念,并不真实存在

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
千里之行,始于足下。
原文地址:https://www.cnblogs.com/jincoco/p/12935845.html