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