Python学习笔记之威虎山武器库

一、系列缘由

  作为一名运维工程师,也一直有一个学习开发的想法,值此之际,不知道博客的下一期目标在哪里,在这思考和犹豫的间隙想着学习和充实一下自己,学习一下python语言,python随着大数据和人工智能的兴起而日益火爆。边学习边实践的原则学习python,希望自己更上一层楼。我的目标是创建一个自己的网站——太阳站点(sun-site.com),一个自娱自乐的自由空间。

二、学习笔记

1、面向对象编程重要概念

  Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。主要需要记住的概念如下:

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

2、类的定义和操作

  • 定义类语法格式如下:
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>
  • 类对象支持两种操作:属性引用和实例化。
  • 属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
  • 实例化,将类赋值给一个变量及实现了类的实例化。

#实例化类
x = MyClass()

3、类属性与方法

  • 类的私有属性
    __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
  • 类的方法
    在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
    self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定使用 self。
  • 类的私有方法
    __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。使用self.__private_methods方式在类的内部调用私有方法。

4、类的专有方法:

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 打印,转换
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__: 获得长度
  • __cmp__: 比较运算
  • __call__: 函数调用
  • __add__: 加运算
  • __sub__: 减运算
  • __mul__: 乘运算
  • __truediv__: 除运算
  • __mod__: 求余运算
  • __pow__: 乘方

5、构造方法

  构造方法是一个名为 init() 的特殊方法,该方法在类实例化时会自动调用。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

三、实践练习

1、游戏代码

#!/root/anaconda3/bin/python
# This is a python program.
'''
这是一个python程序,主要用于展示威虎山上武器库,
武器库中主要有枪和炮两大类,详细武器品种继承父类。
有武器颜色、装弹量等属性。有开火、装弹等方法。
'''
class Gun:
        name = "枪"
        color = "black"
        bullets = 7
        def __init__(self,mycolor):
                self.color = mycolor
        def fire(self):
                if self.bullets>0:
                        self.bullets -= 1
                        print("=>",end=' ')
        def loading(self,zd):
                if (self.bullets+zd) > 7:
                        self.bullets = 7
                        print("子弹已装满!")
                else:
                        self.bullets = zd
                        print("装弹!",zd,"颗")

class HandGun(Gun):
        name = "手枪"

#继承父类Gun
class SubmachineGun(Gun):
        name = "冲锋枪"
        bullets = 30
        #定义类的私有属性,私有属性在外部无法调用
        __conbutton = 1
        #重新fire方法
        def fire(self,lj):
                __conbutton = lj
                if self.bullets>0 and __conbutton == 1 :
                        self.bullets -= 2
                        print("==>",end=' ')
                else:
                        self.bullets -= 1
                        print("=>",end=' ')

class SniperGun(Gun):
        name = "狙击枪"
        bullets = 10
        mirror = 1
        #定义子类私有方法
        def __take_aim(self,mirror):
                if mirror == 1 :
                        print("精准狙击视角!",end='')
                else:
                        print("盲狙视角!",end='')
        def fire(self,kj):
                if kj == 1 :
                        self.__take_aim(1)
                        self.bullets -= 1
                        print("=>",end=' ')
                else:
                        self.__take_aim(0)
                        self.bullets -= 1
                        print("=>",end=' ')

a = HandGun("白色")
b = SubmachineGun("黑色")
c = SniperGun("金色")
print("\na是一把",a.color,a.name,"子弹数量是",a.bullets)
while a.bullets > 0:
        a.fire()
dyl = int(input("请输入装弹数:"))
a.loading(dyl)
print("手枪还剩余子弹:",a.bullets)

print("\nb是一把",b.color,b.name,"子弹数量是",b.bullets)
lj = int(input("请选择连击或者单击,1表示连击,0表示单击:"))
while b.bullets > 10:
        b.fire(lj)
print("\n冲锋枪枪还剩余子弹:",b.bullets)

print("\nc是一把",c.color,c.name,"子弹数量是",c.bullets)
kj = int(input("请选择是否开镜,1表示开镜,0表示盲狙:"))
while c.bullets >5 :
            c.fire(kj)
print("\n狙击枪还剩余子弹:",c.bullets)

2、设计说明

  • 首先定义一个枪的父类,父类有名字、颜色、子弹数量等属性,有开火和装弹方法;
  • 定义一个手枪子类,手枪子类除了名字,其他均继承父类枪;
  • 定义一个冲锋枪子类,继承父类枪,自定义了私有属性连击开关,重新定义了开火方法,根据连击开关确定开火方式为连击或者单击;
  • 定义一个狙击枪子类,继承父类枪,自定义了私有方法开镜,重新定义了开火方法,根据是否开镜选择开火方式为精准狙击或者盲狙;
  • 实例化手枪、冲锋枪、狙击枪各一把
  • 根据提示输入参数,执行装弹、连击击发、开镜等操作。

3、测试实验

在这里插入图片描述
在这里插入图片描述

Guess you like

Origin blog.csdn.net/carefree2005/article/details/121196457