python之面向对象
一、初识面向对象
函数编程的优缺点:
-
减少代码的重复性
-
增强代码的可阅读性
缺点:
- 但凡更改或者增加一条需求,可能整个项目都随之改变.
面向对象编程的优点:
-
是一类相似功能函数的集合,使你的代码更清晰化,更合理化。
-
面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来
什么是类?什么是对象?
类:就是具有相同属性和功能的一类事物。
对象:就是类的具体表现
类和对象之间的关系:
类:
是一个大范围,是一个模子,它约束了事务有哪些属性,但是不能约束具体的值,只有两部分变量和函数
对象:
是一个具体的内容,它是模子的产物,它遵循了类的约束,同时给属性赋上了具体的值
类的格式:
class Student: #类名
daily = '学习' #1️⃣属性,静态属性
exam = '考试'
def work(self): #2️⃣方法,动态方法
print('每天上课')
def homework(self):
print('家庭作业')
类的格式详解:
class Person: #类名可以随便定义,大写开头,要具有可描述性,建议使用驼峰体
def __init__(self,name,sex,job,hb,weapon,ad): # 这个其实就是一个字典
self.name = name #名字可以不相同
self.sex = sex
self.job = job
self.hb = hb
self.weapon = weapon
self.ad = ad
alex = Person('alex', '不详', '搓澡工', 250, '搓澡', 1) #给类名传参
wusir = Person('wusir', '男', '法师', 500, '打狗棍', 1000)
# 调用
print(alex.__init__) # 可以查看整个alex的字典
# 输出结果如下
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}
class 是关键字与def用法相同,定义一个类。
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
preson是一个类: Alex wusir都是这个类的对象
类有一个空间,存储的是定义在class中的所有名字
每一个对象又拥有自己的空间,通过对象名.__dict__
就可以查看这个对象的属性和值
二、从类名的角度研究类
查看类名角度调用类中的属性
1. 查看类中的所有内容 类名.__dict__只用于获取类中全部内容
print(Student.__dict__)
2. 万能的.点. 来进行增删改查
类名操作静态属性
class Student:
daily = '学习'
exam = '考试'
def work(self):
print('每天上课')
def homework(self):
print('家庭作业')
# 通过操作类名的增删改查
print(Student.daily) #1️⃣查看类属性
Student.cloth = '校服' #2️⃣增加类属性
Student.exam = '不考试' #3️⃣修改类属性
del Student.cloth #4️⃣删除类属性
print(Student.__dict__) #5️⃣查看类名Student中全部内容
类的实例化过程方法
#方法 6️⃣类名+括号
obj = Student() # 类名加括号过程就叫做实例化过程
print(obj) # 对象,实例,结果是一个对象的内存地址
三. 从对象的角度研究类
什么是对象
对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象
对象名操作动态方法
增:
# 1️⃣属性的增加
alex.money = 1000000
# 还以上面格式为例
# 打印该对象增加值之前
print(alex.__dict__)
# 输出结果
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}
# 打印该添加属性后的对象
print(alex.__dict__)
# 输出字结果
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1, 'money': 1000000}
删
# 2️⃣属性的删除
del alex.money
# 打印删除字典键值对之后
{'name': 'alexsb', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}
改
# 3️⃣属性的修改
alex.name = 'alex'
# 打印修改之后的结果
{'name': 'alex', 'sex': '不详', 'job': '搓澡工', 'hb': 250, 'weapon': '搓澡', 'ad': 1}
查
# 4️⃣属性的查询
print(alex.name)
# 查对象
print(alex.__dict__)
# 打印查询的结果
alex
四、实例化一个对象
实例化一个对象总共发生了三件事(不太明白)
1. 在内存中开辟了一个对象空间。
2. 自动执行类中的__init__
方法,并将这个对象空间(内存地址)传给了__init__
方法的第一个位置参数self。
3. 在__init__
方法中通过self给对象空间添加属性。
格式:
class Student:
daily = '学习'
exam = '考试'
def __init__(self,n,a,h): #类 可以当做一个模板 1️⃣给这个设置形参
self.name = n
self.age = a
self.hobby = h
def work(self):
print('每天上课')
def homework(self):
print('家庭作业')
liye = Student('小黑',18,'洗头') #2️⃣传参,然后定义一个变量接收
print(liye.__dict__)
mc_sq = Student('骚强',20,'黑玫瑰发廊') #3️⃣传另外一个参,然后定义一个变量接收
对象调用对象的属性
liye = Student('小黑',18,'洗头') #实例化过程
mc_sq = Student('骚强',20,'黑玫瑰发廊') #实例化过程
print(liye.name) #1️⃣对象调用对象的属性
print(mc_sq.age) #2️⃣对象调用对象的属性
# 输出结果
小黑
20
对象调用类中的属性
print(mc_sq.__dict__) #1️⃣调用对象中的全部内容
print(liye.daily) #2️⃣对象调用类中的属性
print(mc_sq.exam) #3️⃣对象调用类中的属性
# 输出结果
{'name': '骚强', 'age': 20, 'hobby': '黑玫瑰发廊'}
学习
考试
对象调用类中的方法
class Student:
daily = '学习'
exam = '考试'
def __init__(self,n,a,h): #1️⃣实例化过程将值传入到这个 方法中
self.name = n
self.age = a
self.hobby = h
def work(self,c): #2️⃣对象调用类中的方法,self指向同一个内存地址
self.color = c
print(f'{self.name}每天上课')
def homework(self):
print('家庭作业')
liye = Student('小黑',18,'洗头') #实例化过程
liye.work('绿油油') #3️⃣给类中方法传值,传给word方法中的c,self共用同一个内存liye
print(liye.__dict__) #查看对象的全部内容
# 输出结果
liye.work('绿油油')
print(liye.__dict__)
五、什么是self?
- self就是类中的方法的第一个位置参数
- 如果通过对象执行此方法,解释器就自动的将此对象空间当做实参传给self
- 约定俗成:类中的方法第一个参数一般都设置成self
六、一个类可以实例化多个对象
例题:
# 人狗大战
# 人的类
class Person:
def __init__(self,name,sex,job,hp,weapon,ad):
self.name = name
self.sex = sex
self.job = job
self.level = 0
self.hp = hp
self.weapon = weapon
self.ad = ad
def 搓(self,dog):
dog.hp -= self.ad
print('%s给%s搓了澡,%s掉了%s点血,%s当前的血量%s'%(self.name,dog.dog_name,dog.dog_name,self.ad,dog.dog_name,dog.hp))
# 狗的类
class Dog():
def __init__(self,name,hp,ad,kind):
self.dog_name = name
self.hp = hp
self.ad = ad
self.kind = kind
def 添(self,person):
if person.hp >= self.ad:
person.hp -= self.ad
else:
person.hp = 0
print('%s添了%s一下,%s掉了%s点血,%s当前的血量%s'%(self.dog_name,alex.name,alex.name,self.ad,alex.name,person.hp))
alex = Person('alex', '不详', '搓澡工', 250, '搓澡巾', 1)
二哈 = Dog('二哈',100,2000,'哈士奇')
alex.搓(二哈)
二哈.添(alex)