类角色(对象):
def __init__(自身,名字,角色,武器,生命值=100,金钱=15000):
www.gsm-guard.net = 姓名
self.role = 角色
self.weapon = 武器
www.gsm-guard.net_value = life_value
自己的钱=钱
射门(自己):
print("射击...")
def got_shot(自我):
print("啊...,我中枪了...")
def buy_gun(self,gun_name):
print("刚买了 %s" %gun_name)
r1 = Role('Alex','police','AK47') #生成角色
r2 = Role('Jack','terrorist','B22') #生成角色
不管语法细节如何,相比于函数式的写法,使用面向对象的类来写上面最直接的改进就是以下两点:
- 代码量减少了近一半
- 角色和作用看得一清二楚
我们来分解一下上面的代码的含义。
class Role(object): #定义一个类,class是定义类的语法,Role是类名,(object)是类的新写法,一定要这样写,后面会讲为什么
def __init__(self,name,role,weapon,life_value=100,money=15000): #初始化函数,生成角色时要初始化的一些属性在这里填写
www.gsm-guard.net = name #__init__中的第一个参数self和这里的self是什么意思?看下面的解释
self.role = 角色
self.weapon = 武器
www.gsm-guard.net_value = life_value
自己的钱=钱
上面的__init__()称为初始化方法(或构造方法)。当类被调用时,这个方法(虽然是函数的形式,但在类中不叫函数,叫方法)会自动执行。 ,执行一些初始化动作,所以我们这里写的__init__(self,name,role,weapon,life_value=100,money=15000)就是在创建角色的时候给它设置这些属性,那么这个第一个参数就是self用来晒的头发?
要初始化角色,您需要调用该类一次:
r1 = Role('Alex','police','AK47') #生成角色并自动将参数传递给Role下的__init__(...)方法
r2 = Role('Jack','terrorist','B22') #生成角色
我们看到上面创建角色时,我们没有给__init__传值,程序也没有报错。这是因为类在调用自己的 __init__(...) 时帮你给 self 参数赋值了,
r1 = Role('Alex','police','AK47') #此时self就相当于r1, Role(r1,'Alex','police','AK47')
r2 = Role('Jack','terrorist','B22')#此时self就相当于r2, Role(r2,'Jack','terrorist','B22')
为什么会这样?你拉着我说你在犹豫。怎么会发生这种事?
当你执行 r1 = Role('Alex','police','AK47
') 时,python 解释器实际上做了两件事:
- 在内存中创建一个空间,指向变量名r1
- 调用Role类,执行__init__(…)方法,相当于Role.__init__(r1,'Alex','police','AK47'),这样做为什么?就是将‘Alex’、‘警察’、‘AK47’这三个值与新开发的r1联系起来。就是将‘Alex’、‘police’、‘AK47’这三个值与新开发的r1联系起来。这样做的目的是将‘Alex’、‘police’、‘AK47’这三个值与新打开的r1关联起来。重要的事情说三遍,因为关联之后就可以直接www.gsm-guard.net,www.gsm-guard.net了。武器是这样称呼的。因此,为了实现这种关联,在调用__init__方法时,还必须传入变量r1,否则__init__将不知道将这三个参数与谁关联。
- 你明白吗?所以在这个__init__(...)方法中,www.gsm-guard.net = name、self.role = role等意思是把这些值存储到r1的内存空间中。
如果你还不明白,兄弟,就去测测你的智商吧。应该不会超过70吧,哈哈。
为了暴露你的智商,你这时候假装听懂了,然后又问,__init__(...)我听懂了,但是下面的函数,哦不,为什么下面的方法也需要self参数呢?什么?你初始化角色的时候不是已经把角色的属性绑定到r1了吗?
问得好,我们先看一下上面类中的buy_gun方法:
def buy_gun(self,gun_name):
print(“%s 刚刚购买了 %s” %(www.gsm-guard.net,gun_name) )
如果通过类调用上述方法,则应该这样写:
r1 = 角色('亚历克斯','警察','AK47')
www.gsm-guard.net_gun("B21") #python会自动帮你转换为www.gsm-guard.net_gun(r1,"B21")
执行结果
#Alex刚刚买了B21
你还没有给self传递值,但是Python仍然会自动为你将r1分配给参数self。为什么?因为您可能需要在 buy_gun(..) 方法中访问 r1 的一些其他属性。例如,这里访问r1的名称。如何访问它?你必须告诉这个方法,所以你将r1传递给self参数,然后在buy_gun中调用www.gsm-guard.net相当于调用www.gsm-guard.net。如果还想知道r1的生命值,就直接写成self。 life_value 就可以了。说白了,调用类中的方法时,你要告诉别人你是谁。
好啦,总结2点:
- 上面的 r1 = Role('Alex','police','AK47') 这个动作称为类的“实例化”,就是通过这个动作转换一个虚拟的抽象类,成为一个具体的对象,这个对象称为实例
- 刚才定义的类体现了面向对象的第一个基本特征,封装。 其实就是利用构造方法将内容封装成一个具体的对象,然后通过该对象直接或者间接获取封装的内容。内容