一、系列缘由
作为一名运维工程师,也一直有一个学习开发的想法,值此之际,不知道博客的下一期目标在哪里,在这思考和犹豫的间隙想着学习和充实一下自己,学习一下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、测试实验