活在当下的程序员应该都听过“面向对象编程”一词,也经常有人问能不能用一句话解释下什么是“面向对象编程”,我们先来看看比较正式的说法。
把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。
这样一说是不是更不明白了。所以我们还是看看更通俗易懂的说法,下面这段内容来自于知乎。
说明:以上的内容来自于网络,不代表作者本人的观点和看法,与作者本人立场无关,相关责任不由作者承担。
之前我们说过“程序是指令的集合”,我们在程序中书写的语句在执行时会变成一条或多条指令然后由CPU去执行。当然为了简化程序的设计,我们引入了函数的概念,把相对独立且经常重复使用的代码放置到函数中,在需要使用这些功能的时候只要调用函数即可;如果一个函数的功能过于复杂和臃肿,我们又可以进一步将函数继续切分为子函数来降低系统的复杂性。但是说了这么多,不知道大家是否发现,所谓编程就是程序员按照计算机的工作方式控制计算机完成各种任务。但是,计算机的工作方式与正常人类的思维模式是不同的,如果编程就必须得抛弃人类正常的思维方式去迎合计算机,编程的乐趣就少了很多,“每个人都应该学习编程”这样的豪言壮语就只能说说而已。当然,这些还不是最重要的,最重要的是当我们需要开发一个复杂的系统时,代码的复杂性会让开发和维护工作都变得举步维艰,所以在上世纪60年代末期,“软件危机”、“软件工程”等一系列的概念开始在行业中出现。
当然,程序员圈子内的人都知道,现实中并没有解决上面所说的这些问题的“银弹”,真正让软件开发者看到希望的是上世纪70年代诞生的Smalltalk编程语言中引入的面向对象的编程思想(面向对象编程的雏形可以追溯到更早期的Simula语言)。按照这种编程理念,程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为“对象”,而我们解决问题的方式就是创建出需要的对象并向对象发出各种各样的消息,多个对象的协同工作最终可以让我们构造出复杂的系统来解决现实中的问题。
说明:当然面向对象也不是解决软件开发中所有问题的最后的“银弹”,所以今天的高级程序设计语言几乎都提供了对多种编程范式的支持,Python也不例外。
类和对象
简单的说,类是对象的蓝图和模板,而对象是类的实例。这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。
定义类
在Python中可以使用class
关键字定义类,然后在类中通过之前学习过的函数来定义方法,这样就可以将对象的动态特征描述出来,代码如下所示。
# 在Python2中这个object一定要写,但是在Python3中可写可不写(默认就继承了object).
#
class Student(object):
# __init__是一个特殊方法用于在创建对象时进行初始化操作
# 通过这个方法我们可以为学生对象绑定name和age两个属性
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, course_name):
print('%s正在学习%s.' % (self.name, course_name))
# PEP 8要求标识符的名字用全小写多个单词用下划线连接
# 但是很多程序员和公司更倾向于使用驼峰命名法(驼峰标识)
def watch_av(self):
if self.age < 18:
print('%s只能观看《熊出没》.' % self.name)
else:
print('%s正在观看岛国爱情动作片.' % self.name
# 实例
student = Student()
说明:写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息
# 学类会有些累.
class Student(object):
"""
第二步初始化,初始化自己.
当你的类有一些公用变量的时候,你就可以初始化
初始化中经常放入公有的变量.
"""
def __init__(self,name):
"""
在类中,一切的变量和函数都要印记(self)
"""
self.name = name
def def1(self,num):
self.num = num
print(self.num)
print(self.name)
def def2(self):
print(self.num)
print(self.name)
if __name__ == "__main__":
# 实例,类名带括号“Student()”,直接运行初始化函数
student = Student('杜苗苗')
student.def1(100)
student.def2()
王者荣耀案例
# 王者农药
# 人机对战
# 1.点击人机对战的按钮(输入)
# 2.挑选人物(典韦,赵云,鲁班)
# 3.显示战力,技能,防御
# 4.人物确定,随机出1个人机,包括战力,名字...等信息显示
# 5.点击开始按钮..
# 6.进入加载页面...
import numpy as np
class wangzhe:
def __init__(self):
"""
初始化王者农药类.
Arguments:
----------
zhaoyun[zhaoyun_xx]:关于人物赵云的参数
dianwei[dianwei_xx]:关于人物典韦的参数
luban[luban_xx]:关于人物鲁班的参数
"""
self.zhaoyun = '[1] 赵云'
self.zhaoyun_zhanli = 250
self.zhaoyun_fangyu = 250
self.dianwei = '[2] 典韦'
self.dianwei_zhanli = 300
self.dianwei_fangyu = 1000
self.luban = '[3] 鲁班'
self.luban_zhanli = 10000
self.luban_fangyu = 10
def choose_model(self):
"""
选择模式
-------
可选模式暂时只有一个1.
"""
mode = input('可选模式[1/2]:1.人机对战,2.多人对战')
if mode == '1':
self.choose_people()
else:
print(' 正在开发中...不要着急!')
def choose_people(self):
"""
用户选择人物..
"""
people = input('请选择你的英雄:(%s,%s,%s)'%(self.zhaoyun,self.dianwei,self.luban))
if people == '1':
print(' 赵云:')
self.information(self.zhaoyun_zhanli,self.zhaoyun_fangyu)
self.random_people()
elif people == '2':
print(' 典韦:')
self.information(self.dianwei_zhanli,self.dianwei_fangyu)
self.random_people()
elif people == '3':
print(' 鲁班:')
self.information(self.luban_zhanli,self.luban_fangyu)
self.random_people()
else:
print('(⊙_⊙)? 不懂你的选择')
self.choose_people()
def information(self,zhanli,fangyu):
"""
打印各个人物的信息
Arguments:
---------
zhanli: 人物的战力参数
fangyu: 人物的防御参数
"""
print('战力:%s,防御%s'%(zhanli,fangyu))
def random_people(self):
"""
电脑随机选择人物..
"""
print(' 电脑开始选择英雄:')
people = np.random.choice(['1','2','3'])
if people == '1':
print(' 和你对战的是赵云:')