面向对象编程
什么是面向对象?
面向对象是一门编程思想
对象在这里指的可不是你的男女朋友
在这里对象指的是特征与技能的结合体
基于改编成思想就好比在创造世界,一种上帝式的思维方式
注意:要将自己当作一个上帝,想创造什么就创造什么,为所欲为
该编成思想的优缺点是:
优点:
可扩展性高
缺点:
编写程序的复杂度比面向过程高
什么是对象?
在说这个之前我们要知道什么是类?
类指的是类型,类别
在程序中,必须现有类,通过调用类,产生对象
对象指的是特征与技能的结合体,类指的是对象之间相同的特征与技能的结合体
定义类的语法
class 类的名字 :
—对象之间相同的特征
—技能
# 定义老男孩学生类,命名规范,驼峰命名法
class OldboyStudent:
# 都在老男孩学习,就是对象之间相同的特征
school = "oldboy"
# 注意:在类内部定义函数,会有一个默认参数,self
# 学生的学习技能
def learn(self):
print("learning....")
# 调用类时,产生对象obj
# 对象调用方法时: 会将对象当做第一个参数传入方法中。
obj = OldboyStudent()
'''
由对象来调用类内部的函数,称之为对象的绑定方法。
对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。
'''
上面说的都是对象之间相同的特征
下面我们来说一下,如何为对象传入独有的特征
使用__ init __()方法
在这里要注意:
由对象来调用类内部的函数,称之为对象的绑定方法
看到self就应该知道是对象本身
init()方法是在类内部定义的方法,在调用类时触发,会自动将对像当做第一个参数传入,括号内的所有参数会一并传给init()
class OldboyStudent:
school = "oldboy"
# 为对象传入独有的name,age,sex
# 注意: 看到self就应该知道是对象本身
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self):
print("learning....")
# 为obj对象独有特征传入参数
obj = OldboyStudent("kang", 18, "male")
print(obj1.name, obj1.age, obj1.sex)
# 打印结果
# kang 18 male
实现类或对象属性操作:增、删、改、查
class OldboyStudent:
school = "oldboy"
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def learn(self):
print("learning....")
# 调用类时,产生对象obj1
# 类名+() 产生对象
obj1 = OldboyStudent("kang", 18, "male")
print(obj1.name, obj1.age, obj1.sex)
print(obj1.school)
# 实现类或对象属性操作:增、删、改、查
# 增
obj1.girlfind = "zhao"
print(obj1.girlfind)
# 删
del obj1.sex
# print(obj1.sex) # 已经删除掉了,现在再打印就会报错
# 改
obj1.school = "old"
print(obj1.school)
# 查
print(obj1.age) # 查看obj1对象中的年龄
对象名字的查找顺序
1、对象.属性会先找对象自己的
2、若对象没有,会找类的
3、若类没有,就会报错
扩展练习:人狗大作战
'''
需求: 有一个人对象,狗对象,人狗互咬。
- 对象人1:
- 特征:
- 生命
- 名字: name = '张全蛋'
- 攻击力: arg
- 技能:
- 咬:bite
狗对象1:
- 特征:
- 生命: 200
- 名字: name = '大黑'
- 品种: dog_type = '黑贝'
- 攻击力: arg
- 技能:
- 咬:bite
'''
# 人类
class Pepole:
def __init__(self, name, hp, arg):
self.name = name
self.hp = hp
self.arg = arg
# 人调用bite时,传入狗对象
def bite(self, dog_obj):
print(f"人:[{self.name}]开始咬狗:[{dog_obj.name}]!")
# 减掉狗的生命值,值为人的攻击力
dog_obj.hp -= self.arg
print(f"狗的血量减少[{self.arg}]还剩血量[{dog_obj.hp}]")
if dog_obj.hp <= 0:
print(f"狗[{dog_obj.name}]已经挂了")
return True
# 狗类
class Dog:
def __init__(self, name, hp, dog_type, arg):
self.name = name
self.hp = hp
self.dog_type = dog_type
self.arg = arg
# 狗对象调用bite时,传入人对象
def bite(self, p_obj):
print(f"狗:[{self.name}]开始咬人:[{p_obj.name}]!")
# 减掉人的生命值,值为狗的攻击力
p_obj.hp -= self.arg
print(f"人的生命值减掉[{self.arg}],还剩血量[{p_obj.hp}]")
if p_obj.hp <= 0:
print(f"人[{p_obj.name}]已经挂了")
return True
p1 = Pepole("张全蛋", 2000, 50)
d1 = Dog("大黑", 200, "黑贝", 350)
import time
# 人狗开始互咬!
while True:
res1 = d1.bite(p1)
if res1:
break
time.sleep(2)
res2 = p1.bite(d1)
if res2:
break
time.sleep(2)
# 打印结果
# 狗:[大黑]开始咬人:[张全蛋]!
# 人的生命值减掉[350],还剩血量[1650]
# 人:[张全蛋]开始咬狗:[大黑]!
# 狗的血量减少[50]还剩血量[150]
# 狗:[大黑]开始咬人:[张全蛋]!
# 人的生命值减掉[350],还剩血量[1300]
# 人:[张全蛋]开始咬狗:[大黑]!
# 狗的血量减少[50]还剩血量[100]
# 狗:[大黑]开始咬人:[张全蛋]!
# 人的生命值减掉[350],还剩血量[950]
# 人:[张全蛋]开始咬狗:[大黑]!
# 狗的血量减少[50]还剩血量[50]
# 狗:[大黑]开始咬人:[张全蛋]!
# 人的生命值减掉[350],还剩血量[600]
# 人:[张全蛋]开始咬狗:[大黑]!
# 狗的血量减少[50]还剩血量[0]
# 狗[大黑]已经挂了