小王是某游戏公司的新入职的职员,有一天,组长交给了他一个任务,为一个即将准开发的一款游戏设计一些人物角色,其中包括多种职业,如牧师、战士和法师等等。每种职业都有一些自身独有的属性和技能,可是也会有一些共有的属性和方法。假设这家公司是用 Python
来开发游戏的。python
经历过面向对象编程学习的小王很快就理清了思路,这须要用类的思想来进行设计。因为这些职业都会有一些共有的属性和方法,显然应该把这些职业的共有属性和方法拿出来做为一个公共的类,而这个公共的类就叫作基类,或者称为父类;其它职业能够基于这个公共的类来进行增长属性和方法,这些职业的类就叫作子类。这就是面向对象编码中的继承的思想,理清了设计思路以后,小王立马开始动手来实现相应的代码。git
首先,对于每个游戏角色,它都会有姓名和性别属性。组长又告诉小王,咱们不能让其它人知道咱们的角色是怎么设计的,以及都有哪些属性,这又该如何设计呢?聪明的小王立马就想到了封装的思想,经过隐藏对象的属性和实现细节能够防止外部的类直接调用属性或者修改属性。因此小王立马写出了以下的代码:github
class Roler(object): """ 用户角色类,须要隐藏属性 Args: __username: 用户名,string __sex:性别, string """ def __init__(self, name=None, sex="male"): self.__username = name self.__sex = sex self.__hp = 1000 def get_username(self): # 获取用户名 return self.__username def get_sex(self): # 获取用户性别 return self.__sex def add_hp(self, hpr): # 角色能够回血 self.__hp += hpr def __repr__(self): # 打印对象信息 return "username : {0}\nsex : {1}\nhp : {2}".format(self.__username, self.__sex, self.__hp)
不一样于 Java
和 C++
,在 Python
中是没有 private
等关键字的。因此咱们如何来定义一个类的属性是私有的呢?方法就是在类属性的名字前加上两个下划线,即表示成 __username
的形式,这就是私有属性的定义方式了。其缘由是由于 Python
的类的内部,全部双下划线的开始的名字都会被替换成增长单下划线和类名的方式。实质上,__username
就被替换成了 _Roler__username
的形式了。编程
role1 = Roler("weisheng", "male") # 创建一个新角色 print(role1) # 打印该角色的信息,调用 __repr__() 方法 print(role1.__username) # AttributeError,该属性是私有的 print(role1._Roler__username) # weisheng,能够打印
有了父类还不够,因为每一个职业都会有一些自身特有的属性和方法。因此,对于每一个职业,咱们也须要实现一个类。小王首先针对牧师这个职业来实现,牧师做为一个法系医疗职业,首先确定须要一个 MP
值。同时,它能给其它用户恢复生命值。所以,能够按照以下方式来实现牧师类:微信
class Pastor(Roler): """ 牧师类,继承自用户角色类 Args: __MP: 魔法值 """ def __init__(self, name, sex): # 调用父类的构造函数 super().__init__(name, sex) self.__mp = 100 def get_mp(self): return self.__mp def __repr__(self): return super().__repr__() + "\nmp : {0}".format(self.__mp) def fullhealth(self, other): # 技能1:回复其它用户生命值 other.add_hp(200)
在定义的牧师类中,首先调用父类的构造函数来对用户姓名、性别、hp值进行初始化。同时,牧师还有个mp值,这个属性是该职业独有的(请勿追究细节)。因为增长了相应的属性,因此 __repr__()
方法也须要重写,能够经过调用父类的 __repr__()
方法再加上牧师类独有的属性。函数
子类不能直接调用父类的私有属性,因此针对父类的一些私有属性,须要经过方法来调用。学习
牧师还有一个技能,他能给其它的用户角色回血,因此须要实习一个 fullhealth()
方法,参数是其它的角色类。测试用例以下:测试
pastor1 = Pastor("ergouzi", "male") # 创建一个牧师职业 print(pastor1) # 打印该职业角色的信息 pastor1.fullhealth(role1) # 牧师能够给其余角色回血 print(role1) # 能够发现该用户的 hp 值发生变化
其余职业的设计能够参照该职业的特色来作出相应的设计,这里就不在多作说明了。编码
经过跟随小王的游戏角色设计,相信你已经对 Python
中的面向对象编程有了必定的了解了。面向对象编程是如今经常使用的一种编程方式,它是相对于面向过程编程来讲的。面向对象编程把对象做为程序的基本单元,一个对象包含了数据和操做数据的函数。该思想最主要的三个特色就是封装、继承和多态,其实这些特色在上述的实例中都有体现,你能发现吗?设计
虽然上述的例子已经阐述了面向对象编程的大部分思想,可是本人也是第一次去进行这些类间关系的设计,因此每一个例子都是很是简单的,可能在思想设计上也存在问题,请见谅。
所有代码请访问:面向对象编程
更多精彩内容将发布在公众号 冰咖啡与狗 ,或搜索微信号 icedcoffee7 添加公众号。