说话。
粉丝121获赞363

视频呢,我将通过实现一个简单的歌词生成 ai, 带大家快速了解深度学习的基本流程,以及拍 touch 这款必备的深度学习框架。首先我们要知道,深度学习或者说神经网络的本质其实是一个数学问题。 我们可以通过训练让一个神经网络学习输入到输出之间的数据映射关系。例如,当神经网络看到这张图片时,他应当知道输出一条狗。 在拍拓器中,构建神经网络的核心数据结构是一个叫做 tensor 的东西,它和我们之前讲到的 number 数组非常类似。不过 tensor 的运算可以被放在 gpu 上执行, 利用 gpu 的并行运算来加速整个计算过程。在吞色之上呢,我们可以构建各种复杂的数学模型,拍 torch 也同时提供了梯度的自动计算。 那为什么需要梯度这个东西呢?梯度你可以简单理解成导数在高维度上的推广。这是因为对于神经网络的训练,或者说一般的最优化问题,大家都会用到一个核心算法梯度下降, 而拍 touch 将偏导数的计算链式、法则这些细节全部都隐藏在了框架中,因此我们可以更加关注与解决实际问题,而不是这些繁琐的计算细节。除了这些基本的计算功能以外,拍 touch 对神经网络还有各种模块化的封装, 比常见的卷基层、线形层、 pulling pying, 各种激活函数、 c, n, r, n, transformer 模型等等等等。以上呢,是对拍拓去的一个非常粗略的介绍。拍拓去单装还是比较容易的,我们可以在这里选择对应的操作系统扩大版本 的康大其实不是必须的。最后复制下面的命令到控制台安装即可。 训练的第一步呢,是准备我们需要的原始数据。数据级通常很容易被我们忽视,但是深度学习中相当重要的一环。有时候即使你的模型再好,但是训练的数据很差,最后也很难得到一个好的结果。这里我使用的呢,是这个中文歌词与辽阔。 在下载的原始数据中,我们可以看到很多非中文歌曲。有些歌词中的格式不工整,有些歌词的前面包含了不需要的信息。因此我们需要对这些原始数据做一些预处理,并将数据转换成我们需要的格式。 这里呢,我写了一个很简单的脚本,过滤掉不需要的歌词,去除多余的文字,并以斜杠来分隔歌词的每一句每一行呢是一首 首歌的歌词,最后存放在一个纯文本中。接下来呢,我们可以利用拍 touch 提供的 data set 和 data loader 来读取这个歌词文件。这两个类封装了基本的数据操作,比如切分训练数据,随机打乱数据,或者对数据进行简单变换等等。 这样我们就不用自己去造轮子了。我们可以通过继承 data 类来定义我们的歌词数据集。接下来,我们可以在一列弹数中加载之前的这个歌词文件,并将所有的文字转化成一个个缩影。 这里我们定义两个 dict, 用来保存缩影到文字,以及文字到缩影的映射。接下来我们需要实现两个函数,第一个函数 lens。 我们需要返回样本的总数。这里我们将所有的歌词文本拆分成一个个长度为四十八的序列, 所以样本总数等于文字的总数除以序列长度四十八,这里为什么减一?我们马上讲到第二个函数 get them, 我们可以根据指定的下标返回对应的文字序列。 这里返回的数据呢,可以被分成两部分,一部分代表网络的输入,另部分代表网络的输出。输入和输出刚好相差一个字,因为输出的文字刚好是对下一个字的预测。 定完毕之后,我们对刚刚代码进行一下简单测试。这里我们可以创建一个数据级对象,然后根据下标随便获取其中的一个样本。 可以看到这里返回的一个整数序列长度为四十八,其中的每个数字代表一个文字的缩影。我们当然也可以根据之前创建的映射将他们再还原成一个个字符。这部检查 打灯确实很有必要的,不然一步错,步步错。在定义了 data set 之后呢,我们需要再创建一个 data loader 来访问其中的数据,主要是因为 data loader 允许我们随机打乱数据或者按批次读取数据。 但这里我还进一步将数据分成了两部分,一部分用来做训练,另一部分用来做测试。原因我们在之后训练的时候讲到。 接下来呢,我们来定义我们用到的这个神经网络结构。在拍拖器中,我们可以通过继承 n n 中的猫九雷来定一个神经网络。这里最关键的是这个 forward 弹数, 他定义了我们网络从输入到输出的整个计算过程,比如数据会经过哪些层,层与层之间有应当如何连接等等。大家在定义模型的时候有一点非常 重要,不管我们要解决的问题有多么复杂,最好都先从构建一个最基本的模型开始,这样会大大降低训练和调试的难度。并且我们在增加模型复杂度之后,可以以这个最简单的模型做参照,确保复杂的模型是否真的表现的更好。 其实对于文本生成问题,使用当下最流行的 transformer 架构应该是更好的选择。不过这里呢,我们先用一个更加简单基本的 rnn 模型来做演示。 首先,我们会将这里输入的文字经过一个 embedding 层转换成一个像量,因为高维的像量能够更好地表示不同文字间的语意关联。接着我们将这个像量传入一个 l、 s, t、 m 单元, 最后通过一个线性层转换成输出的文字。和所有的分类问题一样,这里的文字是使用弯号的像量来 编码的。另外, lstm 单元同时有个隐藏状态的输入和一个隐藏状态的输出。正是因为有这个隐藏状态,才使得我们的神经网络具有记忆的能力,因为我们不希望深沉的歌词前言不搭后语,我们需要让魔性记住文字前后的关系。 如果大家对这里的 inbeding 或者 lstm 不是那么熟悉,也没有关系,大家可以先将重心放在数据的流向输入还有输出上。 比如这里你输入一个字,网络会帮你预测下一个字,然后我们将输出的文字连带隐藏的状态再次传递给神经网络,这样循环往复下去,就得到一整串的句子。 接下来我们来讲一下模型的训练。在训练的过程中,我们会每次抽取数据的一小部分,我们称之为一个 batch, 然后我们会一个 batch 接着一个 batch 的训练。当所有的数据都被训练过一遍之后,我们称之为一个 epoch。 通常我们也会对模型训练若干个 epoch, 让他更好地去拟合训练数据, 我们可以在循环中实现整个训练的过程。对于每一个 app, 我们会一个 batch 接着一个 batch 的训练。这里这项代码呢,单纯代表将训练数据上传至 gpu, 这一步呢是必要的, 因为我们使用 gpu 来加速训练的过程。接下来我们将数据传入之前创建的模型,让模型预测一个输出, 然后我们会去计算这个输出与标准答案之间的差异。这里我们会用到经常听到的损失函数 last function。 但对于不同的问题,我们会用到不同的损失函数。比如对于纯数 数值类型的输出,像温度,房价,这个 los 可以简单是输出与标准答案的绝对值或者是平方差。而对于我们这种情况,由于我们输出的是弯号编码的文字,因此我们会用到交叉箱 cross entry。 但大家可以简单的将这个 los 理解为输出与标准答案之间的差异。通常我们希望这个 los 越小越好,这样代表预测的结果与标准答案更接近。 而我们训练神经网络的目标呢,就是通过缓慢调节网络中的各种权重来降低这个 los。 用到的算法就是我们之前讲到的梯度下降。关于梯度的计算,我们可以轻松的通过调用一句 backward 完成。 然后我们可以调用 optimizer 的 step 函数,通过计算得到的梯度自动修改网络的权重。 这里第一行的 zero grad 也非常重要,他会在计算之前先将梯度清零,避免我们得到一个累加的梯度值。刚刚我们提到的 optimizer 是优化器,它可以通过计算得到的梯度自动更新网络的权重。 adam 和 sgd 是两个非常常用的优化器, 可以看到这里我使用的呢是 adam。 另外优化器还有一个额外的参数,学习速率,他会影响每次权重变化的大小。学习率越大,神经网络权重的变化量就越大。 但学习率绝不是越大越好,过大的学习率会让 los 无法收敛,甚至可能出现随着训练还增大的情况。学习率设置的过小会降低训练的速度,甚至可能让你的神经网络学不到任何东西。当然也有人尝试使用动态的学习率, 比如随着训练的推进逐渐降低学习率。关于学习率和优化器的选择又是一个很宽泛的话题,这里我们就不讲该讨论了。另外,在训练的过程中,我们可以将 los 打印出来,以方便我们跟踪模型的训练进度。 这里我们还可以用到 tensor board 这个库,我们可以调用 at scaler 来绘制像 loss 精确度这样标量的数据。虽然这一步不是必须的,但是图表呈现的信息往往比数字要直观很多。 除了训练之外呢,通常我们还会加入一个模型评估的环节。还记得我们在视频的开头将数据分成了训练和测试两部分吗?通常我们会预留少量的数据做评估,这部分数据并不会拿来做训练。评估的代码和训练非常类似,除了我们不会计算梯度来 更新网络的权重,我们同样会输出一个 los, 然后观察这个 los 下降的情况。因为单纯训练 los 的降低并不能代表模型表现的很好,模型也有可能过度拟合了我们的训练数据。 也就是说,我们的模型对于训练数据表现的很好,但是对于从来没有见过的数据却表现的很差。为了避免这种情况呢,我们会同时关注训练和评估时候的老师以及精确度这些指标。 在真正训练之前,我们最好对之前的代码做一个最最基本的验证。因为训练一个模型通常会花很多时间,有时候一两天都有可能。 如果等你训练完了以后才发现模型根本不工作,那么尼玛当场去世。那么具体我们应该怎么验证呢?比如我们可以修改这里的 data loader, 让我们暂时只使用第一个 batch 的数据,而且我们只用 batch 中的前两个样本来做训练。如果在这种情况下, lost 都不会降低。也就是说我们的模型都不能过度拟合,那我们的代码肯定哪里有问题,需要进行调试。 可以看到这里在训练了几十个 app 之后, los 一直在持续下降,并且预测的精确度呢,也达到了百分之百。到这一步呢,至少可以说我们的代码没有出现明显的错误。 接下来我们可以开始真正的训练。在训练的过程中,我们还可以每间隔一段时间让目前的模型生成一段输出。 这里的 january 弹数我们马上讲到,它会让模型生成一段歌词,并且每一句以深度学习。开始这一步主要是为了实时观测模型的预测结果。可以看到从一开 是几乎不能预测任何内容,到后面生成相对完整的句子。我们模型的输出随着训练有显著的提升。 这里我还做了一些改进,比如我们使用两层的 lstm 单元,并在输出之前额外增加了个线性层。与之前的模型相比较,新的模型进一步降低了 last, 并提高了预测的准确度。 虽然不是每一个修改都能保证模型效果的提升,不过模型优化确实需要我们不断的进行尝试。通常我们在 los 不再降低的时候就可以停止训练了。我这里手动将 apple 设置成了十五个。最后,等模型训练完成之后,我们让他来进行一段作词。 无法忘记你的美,可以让你不再流泪,深深的爱上你度过了多少个 春秋,学会珍惜,习惯了你的温柔,我的心在等待着你回来,是否我已经不再啰嗦,不再来私底里的等待。不错, 一个人的时候,键盘敲着时间的钟,三十年的时光连着我和你。 嗯,不错,狗屁不通。这里生成歌词的间内位弹数稍微有一点点长,不过总体来说,他会将我们规定的首字符先传递给神经网络,然后让神经网络自由创作,直到这一句结束,也就是遇到了斜杠分割符为止, 这里的 next word 函数会将当前字符传入神经网络,然后返回预测的下一个字,中间也会维护一个隐藏状态黑灯。这里的这几句呢,其实只是在对数据格式做变换而已。


世界总有家人常相比, 世界再大不过你我凝视的微笑。 你可以是对的,世界最优的酷派,也可以是宇宙病毒缺的男, 要什么。

啊?我们看一下我们这个音乐推荐系统啊,这是一个思维导图。 呃,我们这个音乐推荐系统包括数据采集、数据处理和存储,还有呃音音乐推荐系统的功能, 数据采集方面我们使用的是愉快词去获取的网络数据。数据处理方面文化我们用的是 pandas 进行了去重异常值处理,还有空值处理。数据存储方面的话我们写入了 csv 文件,也写入了买水果数据库。 呃,推荐我们一整个系统就包括了用户登录和注册,还有系统的一个前台显示,还有呃后台管理系统 首先进来的话就是我们的一个首页,在这里可以,因为之前我登录过这里可以登录一下。 啊,我们登录进来的话这里可以看到。啊,我们这是我们那个收藏的歌曲,我们可以点击,然后我们去播放,我们可以把因为我们现在已经收藏过,我们可以看一下这个歌曲评论。 好,我们现在来到首页,首页的话就包括我们呃根据自己那个自己用户的爱好去推荐了。呃音乐这里还包括热门搜索 和热门下载,我们这可以在这里看到搜索的次数,也可以看到下载的次数,我们可以看一下啊,这里是我们的一个歌曲排行 啊,我们可以呃搜索一下, 根据我们的搜索,我们可以点击去播放 啊,我们可以还可以看一下我们那个后台管理, 我们的后台管理包括歌曲信息管理,歌曲分类管理,还有歌曲动态管理,还有歌曲评论管理,我们可以进行添加和修改 这里,然后去进行修改,这是修改我们要改的歌曲,现在我们来到首页, 来到首页之后呢,我们可以去点击一个我们没有收藏过的歌曲,可以点击一下收藏 啊,这里就会收藏成功,可以看一下这里, 这是我们刚才收藏的歌曲。


看一下第十个,他就说受保护的一些属性,刚才前面我们已经学习了私有属性,对吧?私有属性还有一些,还有一种情况,什么受保护的? 受保护的是怎么去实现的?在我们盘子当中啊,他是前面加一个下黄线,对吧?加两个下黄线呢,表示该属性的是受什么呢?受私有的加一个呢?是保护,是呢,是受保护的。那我们给大家去演示一下哈,大家去演示一下, 那这里哈还是一样的,那我们在这里边加这个人哈,去银行,银行的他的一个地址哈,他的一个地址我们知道啊,他地址是受保护的,是吧?我们加一个 l, e, f, d, d 下划线, a, d, d, r, e, s, s 等于什么呢? a, d, d, r, e, s, s。 然后这里边就是什么就 a, d, d, r, e, s, s 啊,这里这是一个受保护的哈,这是受保护的, 受保护的属性啊。前面学生完了爱心还有这个银行啊,这个银行的一个经理啊,就大堂经理,嗯,银行的,银行的名字,银行的地址,还有什么?银行的一个 呃,序号哈,银行的一个序号,银行的蓝本哈,叫嗯 b 银行这个蓝本哈,就打因,因为每个银行都有一个编号,对吧?每个银行的都有个编号,叫什么?叫 把 nk 呃,扣的哈,西游第一啊。但这个银行的编号呢,我们一般情况下是不对外的,对吧?是不对外的,所以呢这个编号就达标是幺零零幺,是吧?这样这是银行的一个编号, 可能我们一般情况下,在我们大众当心目当中呢,都知道银行的一个名字,银行的一个弟子,是吧?但是很少知道什么呢?银行的编号对吧? 其实每一个银行都有打击的一个编号哈,银行的编号是吧?是有属性是吧?我们学习。然后这个是受保护的,这个呢是公开的哈。呃,实力白亮。 呃,公开的,这是吧?这三种形式,那默认情况底下是公开的哈,默认情况默认是公开的哈, 公开的是吧?然后再哈这样,这是三种,给大家去分别学习了一下。然后这个受保护的呢?他非常简单哈,是非常简单的,受保护的呢,是在外也是可以更改的哈。 p op d a d 下滑键是吧,他可以知道。然后这个地址呢?在什么?在山东济南啊,这样的情况,济南黄海路哈,黄海路 二二八。好好,这样情况哈,然后呢?我们这这是华夏银行,然后这里边哈,我们去取一下,加个地址,内蒙哈,内蒙地址,好吧, 这样的情况哈,然后呢,我们跑一下对吧?跑一下,你看到没有?在我们这个在里边哈,在输出一下银行的地址。 p 哦, pdiss, 然后这个时候呢,我们跑一下,他是没有什么,没有任何东西啊。那怎么把这句话呢?放下边, 哎,我们就可以得到什么银行的地址。山东济南黄海路二十八号哈,这样情况,那说明什么?说明什么?说明啊?受保护的一些哈,受保护的一些属性呢?是可以被修改和保护的啊,这样的情况,关于这个受保护的一些呃,属性啊,我们将在第二当中 给大家做更多的一个讲解,因为这里边是他的应用的。主要是在什么呢?涉及到一个什么啊?涉及到基层是吧?在基层里边,在基层中,在基层啊,关于 受保护的属性以及私有属性以及公开的属性哈。公开的属性在继承中 中的访问权限以及模块 间的访问权限啊,这一块啊,这这一段呢,先我们在第二当中给大家讲哈,先做一个倍数 啊,下一个知识点呢是关于动态属性绑定哈。动态属性绑定,动态属性绑定是什么意思啊?他是因为他是那是动态语言在创建对象的时候啊,可以动态的绑定属性或者方法。我们呢先看了一个,先来看一个代步哈。 动态绑定属性什么意思啊?对不对?那我们先给大家去演示一下啊,演示一下,那举个例子来说啊,这里边你看到没有?这个银行啊,他里边是什么?还是用这个代码哈,这里边有三个三个属性的吧,一个是内蒙,一个呢是。 呃,银行的地址,还有什么银行的编号对吧?银行编号,但是现在有啊,有一天啊,突然间突然间什么就是说,哎。这个银行的什么这银行的, 呃这个银行的,嗯。银行的。大堂经理是谁对吧?我们知道这个银行大堂经理,但是在这里边店里边我没有被写,对吧?但是呢我这个地方去加一下哈。这个银行里边大堂经理是吧?我们去绑定仲裁绑定一个 动态绑定属性啊,那怎么去实验呢? 怎么实现是吧?然后呢这里边很简单哈,就 p 一 op 第二是吧,那大堂经理是吧,我们给他起个名字叫大堂经理是吧?第大啊堂经理是吧?这样情况大经理什么叫什么名字叫叫张三哈。 这是那是吧?那这个动作就实现了什么?动态属性绑定哈。动态 属性绑定是吧?然后这个时候呢我们再跑一下,好吧?跑一下,然后呢这里哈我们就输出下他的大长进里是吧?大长进里是吧?这里边看到没? 这这上啊,跟我们前面哈,就举个例子,这个地方是不是有个呃,我们前面哈给大家去演示了一个啊?实有属性是吧?实有属性,然后这里面就可取到了,这这种方式啊非常简单,你看到没有?就是动态属性的一个绑定,非常简单的。这里有个波浪线,我们瞧一下波浪线什么意思哈? 呃。撇写错误打弹劲的哈。他这个语法语法撇写哈,那我们举过来就打,好吧。嗯,经 对是吧?呃。跑下打糖精 啊,这是一个辟邪问题啊,我们不管他了哈。啊?那就大堂吧哈。这地方叫大堂经理是吧?我们大堂经理叫张三。然后呢就是动态属性绑定啊,如果说 你看到没有,如果说前面这个地方这个呢?前面没有绑定的情况,直接访问他都会报错的是吧?会报错,会告诉你这个属性是不存在的是吧?这样的情况这是给大家去演示一下动态绑定属性。那还有一种情况,什么就动态绑定方法是吧?动态绑定方法,动态绑定 方法都在绑定方法什么意思啊?就是说我们在这个哈,由于这个你看到没有?在这个里边哈,我们就定了一个故障函数是吧?然后定了一个使用方法,定了一个什么?呃。一个 get 马里是吧?那还有一个情况什么意思?就是说我举个列是吧?我想去什么?我想去 get 到哈。 get 到这个, 我想获取这个银行的获取,想想获取这个银行的什么地址,对吧?但这里边我们没有这个方法是吧?没有这个方法怎么办呢?我们在外面定一个方法对吧?要全局 d f 是吧?呃 get 哎。 一 ss 是吧?这里边传一个纸哈,叫 s e f 啊,不用 s m f 叫 f 二哈。嗯,然后呢?传一个名字吧哈。一个名字名 m 一,然后呢?这哈 叫平安 t 嗯 am 一是吧?这样情况。然后这里定一个方法哈,就是在输出一句话叫 我是另外定义的方法是吧?然后这个时候呢,我们再跑一下哈,没问题。别一下。没问题哈,没问题。这个时候呢,我们想去干什么呢?想去动态绑定方法哈。 然后呢?动态绑定方法有两种形式啊?比两种形式 平台绑定方法有两种形式哈。 呃,先看第一种哈。 第一种绑定形式绑定 第一个绑定行杀,然后怎么绑定呢?用实力化,用 p 哦 p d 是吧?嗯 get a d d i e s s 等于什么呢? get 是吧?这样子这种形式啊,然后呢?这样瘦瘦。那这个时候绑定完我们跑一下啊。 呃 get 是吧?然后呢?这里写一下,然后这里需要揣一个值是吧?揣一个什么?就叫中信银行 中线 更新一行,然后再跑一下哈。是不是你看到没有就输出了哈。呃,我是前面加上一句话, 我是内外 里外放吧。我的名字是吧?看到啊,我们跑呀, 是吧?看到这里啊,就得到一个问题啊,就是什么就通过哈,就是这是实力明,这个是方法,这是给实力内部加一个方法,然后呢?这是绑定方法啊,这个地方一定要记住啊,他只是一个方法明啊,方法明,然后呢?下面我们就可以调动他,是吧?调动他,由于这个方法呢,我们知道啊,他前面需要 加一个参数,是吧?加个参数,那我们就给他这个参数这样情况吧。啊?这是一种情况,那还有一种情况啊,这是第一种通过实力明的方式来去给大家去访问一下,是吧?正在绑定方法 这里啊还有一种情况,还有一种情况,就是说我用这些第一种哈,用绑定鞋子,用实力明的进行方式进行绑定,但这里有个问题,什么就说我现在哈看这个方法当中我没有这个跟这个对类本身没有关系,对吧? 哎,我现在呢,我想一个问题啊,我想思考一个问题,我想把这个对象给传递的这个方法当中怎么传的?对不对啊?我们我想干什么呢? 我想把对象,对象, 对象传递到方法中,是吧?方法中 其实很简单哈,很简单,那我们稍微改进一下啊,改进一下,这里边加一个什么 c f s ex i f 点,是吧?然后呢再加个 cf, 是吧?那这个地方干什么呢?再加一个什么 h i f 啊,然后呢?这个地方怎么办呢?我们加这个全数叫 p o p l 一发,然后跑一下啊,看到没有哈?这里我是另外的一个方法, 是吧?我是另外方法,我的名字呢?是这样的,是吧?这个地址是不是这一圈是什么?是不是这个对象的地址啊?他名字是不是中信银行这样的情况吧?那如果说如果打比方说我这个地方不传对象,我传,随便传一个是吧?随便传一个叫 abc 哈, abc, 然后呢?再跑一下是吧?是不是这个地方也没脾气是吧?然后呢,这个地方酒店上我就要存在什么,就 说山东济南的,山东济南的,济南的中心银行,然后呢跑呀, 是不是?那我的名字呢?是山东济南的一个重庆啊,是不是这样情况?然后呢?哈,这个地方可以什么?就晒乎是吧?我这个地方只是起个晒乎,但是呢,他名字具体是什么我们不管是吧?但还有一种情况,什么意思?举个例子来说哈, 九个,打个比方来说,打个比方来说哈,如果说这个地方他确实确实我需要传递一个对象,我想获取到这个银行的地址,怎么办,对吧?呃,我的地址,我的名字和我的地址是吧?和我的地址是吧?然后这个地方怎么写呢? cf d 是吧?就会到了是吧?然后这个地方呢?就写什么呢?如果你这样写的话,他肯定包错,是不是会包错?那这个地方为什么会这样写呢?说明哈,你这个类这个方法写的不够严谨,因为你这个地方这样 去写了他要的什么?要的大夫必须是一个对象啊,是一个,是一个累对象,所以呢,我们这个地方需要什么?必须穿累对象哈。 如果说大家在写这种方法的时候呢,肯定要做一个验证哈,要做,要,要做什么?各种各样的验证是吧?要去看一下他是不是这样的一个对象,那如果不是,那我们就返回哈,在这里边打个比方说啊,加加一个叫艾斯特斯 s t l f 是吧? 叫 p 一哦。嗯,办卡 dnk 是吧?然后呢,这个地方去吧。 呃,数数一下哈。叫,嗯,不是 b a n k。 对象, 请喝, 准备 atm, 这样情况哈。然后呢,我们这里加一个感叹号, 然后跑一下哈,是吧?这样瞧瞧,瞧瞧瞧瞧。第一种绑定箱子 啊,这个地方他传递的是什么传递的啊?然后呢?他没有,我没有给执行然后呢?这里报错了是吧?报错了什么意思啊?报错了,然后瞧瞧,瞧瞧 他的发挥指使处的 l 杀, 然后这次再跑一下哈, 然后呢?说明哈,看到没有,他自行这里了哈。这这我是另外方法好吧,他进进到这里来了哈,进这里了,那说明什么意思啊?说明 啊,他是不是。然后这个地方应该反了哈,我写反了,写反了情况之下他等于等于那个 led 是吧? 等于防护指,我们前的防护指啊。 嗯,他仿佛的是一个波尔类型的,波尔类型的出货 boss f l s 一啊,这跑下 看到没有哈,这样的就是什么意思?就是说现在哈,就说他,我现在呢,去给他验证一下,我这里边就随便穿那个 是吧?穿这个制服,这山东济南的是吧?然后呢,他就会给我返回一个什么,就说他去验证一下,你当前闯过来这个对象是不是这个对象?对象半个是吧,如果不是他就告诉你什么不是半个对象,请核对是吧?那下面代码就不自行了吧。如果说这个地方我们重新传一下,就传什么?传当前的一个,嗯 bnk 哈。 然后呢,这个时候我们再跑一下,再跑一下哈,看到没有他就会说是什么?比如不是半个对象是吧?不是半个对象什么意思啊?来这个地方还不对,是吧?那我们再写,然后这个这个时候再跑。 哎,看到没有?我是另外方法,我的名字和地址,什么?山东济南黄海路二十八号是吧?中信银行,是不是这样的情况?这是什么?就是说第一种方式啊?通过什么?通过这个 我们把这个什么当前实力给传递过来了,是吧?这是这是用什么用的这个 这种方法。那下面呢?我们用第二种方法来解释一下。第二种方法,嗯?把它给去掉。第二种方法是什么?第二种方法哈,嗯, 第二种方法是吧?那刚才这第一种方法,我们再打开一下,第一种方法是什么意思啊?就是说现在把它删掉, 把这个给删掉,给删掉。然后啊,这里边有一个有这么一个问题啊,给大家去演示一下。有这么一个问题,现在哈,我这是第一个皮包,是吧?第一个实力,然后呢?我再去实力一个是吧?再去实力化一个叫 p n k 一等于什么? b a k。 哇,这个地方叫什么?刚才那个叫中信华夏银行,这个叫什么?叫?嗯? 招商银行啊,招商银行是吧?那这个时候呢?答案比较多,我现在呢去我第一个哈,第一个银行,你看到没有?我去绑定了一个这个盖的方法是吧?这个方法,那如果说我用这个什么比另外一个银行也去调这个方法是吧? get 一下, 哎?滴滴阿姨 ss 是吧?给他一个什么按照这个啊,给他一样的。呃,这样的,给他一样的。然后呢?这里面传递两个三数, 是吧?然后这个时候呢?招招商银行,然后跑一下投汇报错,是吧?投汇报一个错误。为什么报一个错误哈?看到没有?招招商银行这里边是传递几个参数啊? 呃,实力化的时候是还有个内幕了啊?内幕,然后呢?我们瞧瞧 啊?两个参数哈,这里边来 改一下两个参数,然后这时候再跑一下哈,看到没有?他还有一样一旦会报错啊,一旦会报错。所以说什么这个银行没有这个方法啊?没有这个方法,那什么意思啊?就说我是第一种方法,我刚才呢是通过实力当前实力哈通过当前实力。第一种方式呢?通过 当前实力啊,通过当前通过实力, 通过实力绑定方法啊?只能在当前实力上用在当前实力上访问 防护,是吧?这样情况,那如果在其他实际上呢是防不了的,是吧?在其他实际上是防不了的, 在在其他实力上是 访问不了的,是吧?这样情况。但是现在我想去在其他时间去访问一下,怎么办呢?哎,有一个方法哈,我们看第二种方法第二种方法就通过利明哈通过利明访问,通过利明绑定, 通过类明绑定方法,是吧?那这个时候呢改进一下啊,这个地方我们通过什么?皮包钉,是吧?把把这句话给复制过来, 是吧?复制过来,然后呢?我们的类名字叫 b, 是吧?他然后呢?这个时候我们再去反复一下啊,刚才我们这这句话不是反复不了吗?我把它给复制过来,对吧?再复制过来,然后呢?再 烤鸭, 然后就包错了哈,就这里边是盖的这个兔对吧?然后呢?他需要两个位置参数,但是我们给了三个是吧?给三个怎么办呢?第一个就不给了是吧?然后再跑一下, 哎,看到没有?是没?是不是没问题了?是没问题了。那如果说通过这里还有一个问题。什么?如果说通过类名绑定的话,那第一个参数呢?就不需要给了是吧? 啊? 通过类名绑定 绑定方法啊?第一个实力哈第一个实力话第一个 对象开始啊对象,但是就对象他说啊就不需要提供了是吧?这样情况看到没有? 这是通过联名绑定的,然后只需要给传递一个插入就可以了。那如果说啊,打个比方的多,我们再写一个哈再写一个。呃,这是这个,那现在呢?我们用另外一个可不可以防蚊呢?对不对?屏保哈。第二第二个实力, 这个叫实力。什么叫皮哇?然后呢?这个叫什么?叫农业银行? 物业银行啊,然后再跑一下, 然后报错了是吧?报错了,我们瞧这拿来报错了哈。嗯,报错了报错了。然后呢?儿子做 s 皮毛点儿的 get, 儿子做 s 米斯湾内蒙是吧?给他的钻石。这是多少号?这是六十八号, 就这里哈然后呢他这里需要一个,需要一个位置参数内幕,然后我们给他了这个内幕啊给他,然后呢?这里边我们需要处理一下哈,这个地方需要把它给注射掉啊然后呢?这里边也注射掉 啊,然后呢?我们再跑一下,没问题了哈。你看到没有哈?就是说我如果说通过类名绑定的方法,那说明呢?说明哈?说明什么?说明这个方法是所有实力共享的,对吧?是所有实力, 所有实力共享的啊,这样情况,如果说通过类名绑定的方法是拖入实力共享的,如果说通过实力去绑定的,那只能局限于当天实力,这样的一个情况,是吧?给大家去讲讲,重在绑定属性啊, 重在绑定方法,这样情况,下面我们再看一下啊,当然哈,对这个刚才那个属性也是一样的哈,动这个属性的绑定,重在绑定属性的动平台 动态绑定属性,也是两种方法哈,两种方法啊,第一个呢是一个呢,一个是通过实力名 啊,一个呢是通过类名啊,跟这个就这这两种情况啊,就是如果通过实力的话进的他的作用呢?只局限于本实力名,如果是通过类名的,那也是亚大所有实力共享,这样的情况 啊,这里跟这个绑定方法是一样的哈,这具体过程跟绑定方法是一样的,下面我们再瞧一瞧哈啊,通过这个,我们刚才这个 这样我们可以看一下哈,就是说,嗯,这里给大家讲完了哈,嗯,讲完了这个也是没问题的哈, 这里哈还有一种,还有一种试一下方式哈,刚才我们是不是通过这种哈,就是通过这种就是说,呃,绑定方式啊,我们通过这种就是说把这个当前的对象呢给传递过去了,是吧? 我们在这里传的哈,就是说酒店刷,我们看一下这个方法,我们这里是不是做了一个验证啊?是吧?是塞尔福是吧?还有个哈,就是我们这个 在乎的是不是当前的一个半个的一个实力,对吧?我们做了一个验证,那这里哈我们通过这种方式,第一种啊,这是第一种方式给他绑定了是吧?绑定了,那还有一种绑定方式啊,再给大家去演示一下另外一种绑定方式啊,另外一种绑定方式,呃, 演示,演示一下 另外的一种绑定方式是吧?然后这里还需要导入一个模块哈,导入一个模块叫 m 八阵的哈, flm。 嗯, mp 二 t, 然后这里啊,我们去改进一下。怎么去改进呢?我们把 这两个都改,都注册掉哈,这个是通过类名的注册掉, 通过类语访问的,然后呢?注视调,注视调是吧?这是第二种是通过类名,第一种呢是通过实类名,然后下面我们演示一下,就是说通过还是一样的哈。通过先通过什么?通过?实力叫 bnk。 可以一等于什么呢? m 一 m 一,嗯,我瞧瞧啊, a d d a d d d 二一 s s a d d r 一等于什么呢? m 一是吧,然后在里面铲参数。 传什么呢?第一个传什么?传的是对象哈,从那个对象叫 b n k。 第二个呢是实力是吧?方法名啊,方法名 abd 二一二三四。选错了吗?我啊,先去找方法啊, 哎,弟弟二一二三四干了哈。 这个,然后呢,这是一个,第二个是什么?第二个是实力 bmk 是吧?这是啊,呃,绑定方法, 然后啊,这个时候我们调一下 a k 点接他 指引一下哈,你瞧瞧, 这里会报错哈,这是 miss you one 是吧?找一个厕所叫,叫什么呢?叫 中国银行,烤鸭哈,烤鸭啊, 然后呢,我是例外的方法,我的名字和地址是中国银行,然后这里边没有输出哈,没有输出。这个 cf 把塞尔夫的耳朵拽死,哎,塞尔夫的耳朵拽死,他没输错。 嗯,那把对象干出来哈,然后特殊再跑一下, 看到没有哈,这个是这样的一块,然后呢?我们瞧一瞧,哪里有问题?蚌壳啊,这里哈,我们没看到没有哈,这个地方我们需要给他一个地址哈,叫由于蚌壳这个地方啊,你看到没有?这个地方他我们直接哈,你看到没有?我如果说这里我们改一下 是吧?我跑一下看,看到没有地址,没有输出来是吧?没有输出来,为什么?因为我们这个地方绥化的时候蚌可点 k 是吧?这个地方,这个地方地址是空的哈,我们写下地址叫山东呃,泰安哈。嗯,山东,济南,济南黄河路哇, 和路是吧?幺幺号幺幺零哈。这样的话我们在跑样,看到没有啊?就是他就会输出什么呢?哎。我的地址是什么呢?中国银行,我的地址黄河路幺幺零是吧?这个时候他就会输出,说明什么,他就自动的把什么,把当前对象哈,把当前对象, 把大家对战给传递过去了,是吧?这是通过实力名,然后呢?这是第一种情况是吧?第二种情况呢?是通过类名哈,通过类名,但是这种通过实力呢,我们还是一样的啊,看 p o p 第二第二,哎哎 啊,我们通过这个看,可不可以帮我哈, 这个叫什么呢?哎,叫工商银行, 孩子会报错哈。说明什么呢?说明没有这个没有这个方法哈。那这个时候怎么办呢?就是通过实力孩子不可以的哈,还不可以的。然后呢?这个时候我们再去改进一下哈,再去改进一下,这是第一种通过实力,那第二种呢?是通过什么呢?通过哈,通过这个 通过这个通过。通过什么呢?通过这名哈, 同类名,然后这里啊就是一个,这是一个半颗,半颗点一,然后呢我们去类名,类名类的类的 累了, b a k 啊,然后这地方穿 b a k 啊 啊,这个是绑定方法,下面再跑一下,没有错了是吧?没有错了哈,然后呢?这是第一个实力没问题是吧? 那这个时候哈,我们把这个前面给注射掉呃,免得受影响哈,这个情况跑一下没问题哈,没有不处对象, 不是对象啊,不是对象就对了哈,不是对象就对了,因为什么?因为这我们查的是一个什么通过类名去访问的哈,通过类名去绑定的,所以不是对象是正确的哈。那另外一种我们再跑一下,用第二个实力是吧?我们再跑一下, 是不是看到没有?两个哈都跑了是吧?都跑了说明什么呢?哈,说明是没问题的哈。这个地方呃说明是没有问题的。然后这里边我们去验证一下,然后把当前的一个摄像头呢 啊来输出一下哈,看到没有哈?然后四 f 点,哎 啊,因为没有被实力哈,看到没有?这个地方没有被实力,所以呢他是一样的哈,他是仿他是获取不到的哈,看到没有?他是这样的,不是不是半个对象,因为为什么?因为没有被实力化是吧?没有被实力化,但是呢他可以去访问哈,可以去访问。
