现在, 最好的学习方法是实际查看代码的运行情况｡
所以理论上, 让我们编写自己的类｡
我会删除所有的内容, 然后从头开始｡
假设我们为一家游戏公司工作, 而这家游戏公司有, 嗯, 他们想创造一个巫师游戏,
就像哈利波特一样｡
现在, 我们该如何看待它, 一个面向对象的编程呢？
我们首先需要的是球员｡
好吧, 我知道了
每个玩家都有一个角色需要扮演｡
我们在这里创建一个类, 并将其命名为player.
性格｡
再来一次｡
请注意命名约定, 因为它是一个类｡
还有｡
另一个规则是, 通常你希望它是单数, 而不是复数｡
所以你不能说玩家角色, 因为我的意思是, 这是一个蓝图｡
从这个蓝图中, 我们将创建许多角色, 但这些都是对象｡
所以玩家性格单一｡
现在在这里, 我要做几件事, 我会警告你们, 这看起来会很混乱, 但是请耐心等待｡
我会解释的
我们要定义一个下划线, 下划线在里面｡
下划线, 下划线｡
在这里, 我们要说self｡
然后给予它起个名字｡
角色的名称｡
从这里开始, 我们再演一次科林｡
并简单地说出自我打点的名字｡
等于名称｡
哦, 天哪｡
刚才发生了什么？
我还是先不解释它的作用, 只多写几行代码, 这样它就更有意义了.
我将在这里写另一个方法我将定义, 比如说, 一个run方法每个玩家都可以运行.
在这里, 我将再次有这个奇怪的自我病房, 然后简单地在这里, 说打印｡
快跑啊
好了, 我刚刚创建了这个类｡
我还是有点困惑｡
我们并不真正知道这里面是什么, 自我是什么, 以及这个全新的面貌｡
但我们先忽略这一点, 简单地说｡
玩家｡
一个是等同于玩家角色并实例化该玩家｡
所以才这样｡
我们可以打印播放器, 看看这个播放器是怎么回事｡
如果我单击“运行”｡
好吧, 我去透透气｡
这是一种空气｡
它说它缺少一个必需的位置参数名称｡
好吧, 我会的
让我们在这里休息一下, 看看这里发生了什么｡
你看到了吧？
方法是一种特殊的方法｡
你可以看到这里的两条下划线｡
这被称为邓德法或魔术法｡
我们会有一个视频专门介绍这个｡
但是当我们构建类的时候, 你通常会在顶部看到这个｡
这就是通常所说的构造函数方法或init方法｡
每次实例化时都会自动调用｡
记住, 实例化意味着我们调用类来创建一个对象｡
所以当我这样做的时候, 它会自动运行这个代码块中的任何内容｡
所以当我运行这个程序的时候, 你会看到我得到了一个错误, 在线9, 就在这里, 在线｡
九个｡
而当我试图实例化玩家角色时｡
它在其中运行, 然后它试图做自己｡
名称等于名称｡
但问题是我没有给它一个参数名｡
这是因为当我们调用它时, 我们接受self之后的任何东西作为参数｡
姓名｡
所以我们需要给它取一个这个字符的名字｡
假设她的名字是辛迪｡
如果我单击此处的“运行”｡
好吧, 我会的
看起来我有一个玩家角色｡
事实上, 它甚至告诉我它是一个在这个内存位置的对象｡
所以在我们的电脑上, 这就是玩家角色player1现在的位置｡
非常酷｡
但是这个self关键字是什么, 这个在线代码是做什么的？
这是我们定义的一种方式｡
嗯, self self指的是玩家角色｡
它是说,
这里要引用这个参与者角色我们要创建一号参与者我希望self, name等于参数名.
所以如果我在这里输入玩家的名字, 然后单击“运行”｡
我得到辛迪｡
为什么是辛迪？
嗯, 因为我给了它参数球员字符｡
当我实例化它时, 我传递了name参数｡
当我在类中定义的时候, 默认参数是self, 你可以看到, 当我们定义方法的时候,
第一个默认参数是self.
现在我给予名字给self. name｡
如果我在这里删除它, 然后单击“运行”, 会怎样？
您可以看到它显示对象没有属性名称｡
因为为了让我说, 嘿, 我想让玩家有一个名字, 我需要说self.
因为self指的是参与者1｡
如果你还记得我们有一个列表的时候, 我们必须做点, 然后我们会说附加｡
有人写了这个附加代码, 在附加代码中, 它会写self.
我们假设把add加到列表中, self指的是点左边的任何东西｡
这样我们就可以引用一些还没有被创建的东西.
参与人1让他们知道,
当我们创建它的时候, 当我们实例化它的时候, 我希望你们确保参与人1有这个名字属性这样如果我创建另一个参与人汤姆就会成为参与人2.
如果我打印球员的名字, 我点击运行｡
我有两个不同的球员, 有两个不同的名字｡
我可以使用相同的代码, 但有不同的值, 因为每次我实例化这个,
都是指第一次的参与者1, 然后是第二次的参与者2｡
自我是一个非常非常难以理解的东西｡
你可能需要看几遍这段视频, 但这里的关键对你来说应该很明显｡
也就是说, 我只能编写一次代码｡
还记得我们的原则驱动器吗？
不要重复你的话｡
我可以让它动态化, 我们要为对象创建的数据是动态的,
它会根据我们给予它的数据而改变｡
这样我就可以创造出不同属性的不同球员｡
但仍然使用相同的代码｡
现在我可以有多个东西在这里｡
比如说H, 我可以说self h等于H, 然后Cindy必须通过,
比如说44和托马斯21.
所以, 这里再一次, 如果我做年龄｡
它们会有不同的属性｡
请记住, 这些是这些对象所具有的属性或特性, 您可以通过点标记法访问它们,
然后访问特性本身｡
你可以看到我这里没有括号因为它不是一个方法, 它没有采取行动.
它只是简单地说, 嘿, 我想访问这个属性｡
如果我在这里做了点, 我的编辑会告诉我, 我们会有一个符号, 嘿, 你可以访问属性,
年龄和名字｡
事实上, 我也可以运行这个方法, 所以如果我单击“运行”｡
记住, 跑步是一种方法｡
我得到了这个绑定方法, 但它没有打印任何东西, 也没有执行任何操作｡
所以我们必须再次加上括号｡
打, 跑｡
看看这个｡
我能跑｡
那我就什么也得不到｡
然后是21岁｡
为什么我们会得到这个？
一个都没有？
因为记住, 这是一个不返回任何结果的函数｡
当一个函数不返回任何东西时, 我们得到什么？
我们一个都没有｡
所以也许我可以说退货完成了｡
如果我单击“运行”｡
你去那里｡
我们已经完成了21个｡
在结束这段视频之前还有最后一件事｡
有趣的是如果我选一号参与人｡
然后二号玩家和我打印这个, 然后我点击运行｡
你会看到我得到了玩家角色｡
但是对象, 一号参与者和二号参与者, 在不同的内存位置.
所以我可以用一段代码, 一个蓝图来创建多个玩家｡
但这些球员不一样｡
它们是由同一张蓝图创造出来的, 但它们在内存中的位置不同｡
这就说得通了, 对吧？
我们不想让汤姆和辛迪成为同一个玩家｡
他们是两个不同的玩家｡
这样我们就能保证安全｡
我给参与人2加的任何东西, 比如说, 参与人2现在可以进攻了.
而攻击力将只是一个属性, 将是50｡
现在, 如果我不攻击这里, 你会看到参与人2有.
进攻｡
但如果我真的打或者想要进攻｡
我去透透气｡
对象没有属性｡
进攻｡
我希望你开始看到类的力量｡
虽然一开始可能很难理解｡
当我们能够创造这个蓝图, 我们现在可以一遍又一遍地使用它来创造我们自己的物体时,
这种力量就变得显而易见了｡
让我们在下一个视频中深入了解｡