本文章最初发布在 XJHui’s Blog,未经允许,任何人禁止转载!
注意:最新修改版本已发布在 这里,点击前往查看!
编程思想
- 面向过程:根据业务逻辑从上到下写代码
- 函数式:封装到函数中便于以后调用,对比面向过程减少了代码量
- 面向对象(oop):采用对象的概念建立模型
类和类的对象
概念
- 类:是具有一组相同特征【属性】和行为【方法】的对象集合
- 对象:是实实在在的东西,也是类的实例化,具体化
关系
类是对象的抽象化,对象是类的一个实例
类的抽象
案例1:小明开着宝马车去逛街
- 小明 -> 人【类】
- 类名:人
- 属性:年龄、身高等
- 方法:吃饭、睡觉等
- 宝马车 -> 车【类】
- 类名:车
- 属性:颜色、排量等
- 方法:前进、倒车、加速等
案例2:坦克大战中的类
- 坦克【类】
- 类名:坦克
- 属性:血量
- 方法:发射子弹、移动等
- 墙【类】
- 类名:墙
- 属性:血量、类型
- 行为:阻挡
- 子弹【类】
- 类名:子弹
- 属性:威力
- 行为:移动
定义类、创建对象
定义类
格式
1
2
3class 类名: # 注意:类名使用大驼峰命名法(首字母大写),可以不加括号,后面会详细写
属性
方法 #属性、方法的个数非定值,根据具体情况确定案例:定义人【类】
1
2
3
4
5
6
7
8
9
10class Person: # 类名
name = '小张' # 属性
age = 18
pos = '山东省'
def eat(self): # 方法
print('在吃饭呢!')
def run(self):
print('在跑步呢!')
创建对象
格式:
1
对象名 = 类名()
案例:创建一个人【类】的对象
1
perA = Person()
使用(pycharm工具下):
调用类方法:
1
perA.eat() # 调用Person类中的eat方法
运行结果:
打印类属性:
1
print("{}的年龄是:{},住在:{}".format(perA.name, perA.age, perA.pos)) # 输出类属性的值
运行结果:
实例方法、属性
区别普通方法
普通方法:
1
2def Func(): # 普通方法
print('这是普通方法!')实例方法:
1
2
3
4
5class Person:
name = '小张'
def eat(self): # 实例方法,定义在class中且有默认的参数self
print('在吃饭呢!')总结:
- 【相同点】均使用def关键字定义
- 普通方法在class外部,实例方法在内部
- 实例方法默认参数为self可更改但不可省略
- 实例方法归属实例对象
区别类属性
类属性:
1
2
3
4
5class Person:
name = '小张' # 类属性
def eat(self):
print('在吃饭呢!')实例属性:
1
2
3
4
5
6class Person:
name = '小张'
def eat(self):
self.color = 'yellow' # 实例属性,注意要用self引用
print('皮肤颜色为{}'.format(self.color))总结:
- 都是定义在class内部
- 定义在实例方法里面的是实例属性,定义在实例方法外面的是类属性
- 定义实例属性时要用self引用(self.变量名,具体看2nd)
__init__方法
基本概念
- python自带的内置函数具有特殊含义,使用双下划线包起来,又称【魔术方法】
- 是初始化方法,用来【定义实例属性】和【初始化数据】,在创建的时候自动调用(类似java中构造方法)
- 利用其【传参机制】可以使对象的创建更加简单、方便
init的使用
定义实例属性
一般方法:
1
2perB = Person()
perB.age = 19 # 添加实例属性__init__:
1
2
3
4
5
6
7
8class Person:
name = '小张' # 类属性
def __init__(self): # 定义实例属性
self.age = 19
def eat(self):
print('在吃饭呢!')总结:
- 可以在创建对象后使用【类名.实例属性名】
- 也可以在 _init_ 方法中使用【self.实例变量名】来定义实例属性
初始化数据
可以用来初始化类属性的值
1
2
3
4
5
6
7
8
9
10
11
12
13class Person:
name = '' # 类属性
age = 0
pos = ''
def __init__(self): # 定义实例属性
self.name = '小李'
self.age = 20
self.pos = '河南省'
perB = Person()
print(perB.age)运行结果:
传参机制
通过传参实现在创建对象时给类属性赋值
1
2
3
4
5
6
7
8
9
10
11
12
13class Person:
name = '小李' # 类属性
age = 20
pos = '河南省'
def __init__(self, name, age, pos): # 传参数
self.name = name
self.age = age
self.pos = pos
perB = Person('小张', 17, '北京市') # 创建对象时将数据作为参数传递
print('{}的年龄是:{},住在:{}'.format(perB.name, perB.age, perB.pos))运行结果:
理解self
实例方法都有一个默认参数self,其名称可更改
相关概念
- self和实例对象指向同一个内存地址
- self只有在定义实例方法的时候才有意义
实例对象传参
1 | class Person: |
运行结果:
魔术方法
_str_
格式化输出对象信息
默认输出对象信息的格式:
1
2
3
4
5
6
7
8
9class Person:
name = '小李' # 类属性
def eat(self):
print('在吃饭呀!')
perB = Person()
print(perB)运行结果:
使用__str__输出对象信息:
1
2
3
4
5
6
7
8
9
10
11
12class Person:
name = '小李' # 类属性
def __str__(self):
return '我的名字叫:{}'.format(self.name) # 注意要通过return返回要打印的内容
def eat(self):
print('在吃饭呀!')
perB = Person()
print(perB)运行结果:
_new_
创建实例化对象
1 | class Person: |
运行结果:
注意:
- new方法是创建实例对象必须要包含的,但若创建对象时不存在new方法,则会使用默认的new方法
- 创建实例对象时new方法通过【return】将创建的实例对象返回给init方法,所以【new方法】执行时间是早于【init方法】的
new和init区别
- new方法:类的实例化方法,使用时要【return】实例对象
- init方法:定义实例属性、类属性的初始化
- new方法执行时间早于init方法
双人对战游戏
问题描述
有两个人物:西门吹雪、叶孤城
属性:
用户名:name
血量:hp
方法:
- tong():捅对方一刀,对方掉血10滴
- kanren():砍对方- 刀,对方掉血15滴
- chiyao():吃一颗药,补血10滴
要求:每走一步打印一次人物状态
问题分析
- 两个人物可以抽象出一个【玩家类】创建两个【实例对象】
- 属性、方法
- 通过随机数来确定走哪一步
游戏代码
运行结果:
不足之处,欢迎留言,会及时回复!
创作不易,感谢支持!