面向对象
面向对象
编程思想
1.面向过程编程
面向对象过程就像我们之前写的代码,按照流程解决问题. 需要写出每一步的流程.
eg:我想吃西红柿炒鸡蛋
1.去菜市场
2.去蔬菜摊买西红柿
3.去买鸡蛋
4.回家准备
5.油盐下锅炒
6.吃上了西红柿炒鸡蛋啊
---------------------------------------------
2.面向对象编程
对象就是容器,数据与功能的结合体。给不同对象绑定特定的数据与功能
eg: 想吃西红柿炒蛋
可以把菜市场 , 人, 厨房 封成三个对象,每个对象有每个对象的功能。菜市场可以有 买鸡蛋和买西红柿的功能,人可以有想吃什么,和吃了什么,做什么吃功能。厨房就有厨房里的一切(油盐酱醋)。
"""两者没有优劣之分,结合实际需求选择编程"""
类与对象
对象: 数据与功能的结合体。
类: 多个对象相同的数据和功能的结合体
怎么理解呢?
eg: 现在有两个人,我们都拥有一些共同的地方,比如我们都有名字,性别,年龄,身高这些相似的地方。
那么这两个人我们可以定义成一个类(人类),而这两个人就是这个具体的对象,我们 提到人类都知道 人都有名字,年龄,身高这些属性。但你并不知道具体叫什么名字,年龄多大。他也有一些属于自己的属性
""" 一个人 对象(有着自己的属性)
一群人 类(人类)有着人都有的相同的属性"""
python中 必须先定义类才能产生对象
类与对象的创建
上面我们说了python中必须先定义类才能产生对象,其实也就是借助类来产生对象。
1.类的语法结构:
class 类名:
"""注释"""
对象公共的数据 # (统称类体代码)
对象公共的功能 # (统称类体代码)
1.定义类必须要有关键字 class
2. 类名其实和变量名没有差别,但为了快速识别做区分建议首字母大写。
3. 数据其实就是 变量名 = 变量值
功能就是 函数
2.类的定义与调用
类在定义阶段就会执行类体代码,产生一个类的 名称空间
class Student:
school_name = '我是人'
def choice_coures(self):
print('厕所功能')
# 查看名称空间方法
"双下__dict__"
print(Student.__dict__)
# {'__module__': '__main__', 'school_name': '我是人', 'choice_coures': <function Student.choice_coures at 0x000002BD070F7700>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
'我们可以查看到类名称空间里的所有名字与数据'
可以通过 . 句点符的方式来访问类里的数据与功能
print(Student.school_name) # 我是人
print(Student.choice_coures) # <function Student.choice_coures at 0x000002BD070F7700>
类名加括号 就会产生对象,并且每多执行一次都会产生一个新的对象。(内存地址不同是一个新的对象)
obj1 = Student() # <__main__.Student object at 0x000002001DEA5A60>
obj2 = Student() # <__main__.Student object at 0x000002001E2E0130>
可以用对象名+句点符 获取数据
print(obj1.school_name) # 我是人
print(obj2.school_name) # 我是人
可以通过类名.数据名的方式更改数据的值
Student.school_name = '我是狗'
'修改school_name 的值'
print(obj1.school_name) # 我是狗
print(obj2.school_name) # 我是狗
"""数据和功能的别称: 属性名与方法"""
给对象添加独有的数据
class Student:
school_name = '我是人'
def choice_coures(self):
print('厕所功能')
obj1 = Student() # 产生一个对象
obj2 = Student() # 再次执行产生一个新的对象
print(obj1.__dict__) # 空的{}
print(obj2.__dict__) # 空的{}
给每个对象 添加独有的 数据(属性)
obj1.__dict__['name'] = 'jason'
obj1.__dict__['age'] = 17
obj1.__dict__['hobby'] = 'raper'
print(obj1.__dict__) # {'name': 'jason', 'age': 17, 'hobby': 'raper'}
"""类似于字典中不存在则新建数据,但是如果我们给多个对象添加独有的特征就需要反复的使用此代码,添加了代码重复率"""
"可以将此代码封装成函数,放进类里。"
class Student:
school_name = '我是人'
# 专门给学生添加独有数据的功能
def init(obj, name, age, hobby):
# 使用init方法可以在产生类的时候自动触发
obj.__dict__['name'] = name
obj.__dict__['age'] = age
obj.__dict__['hobby'] = hobby
def choice_coures(self):
print('厕所功能')
obj1 = Student() # 产生对象
Student.init(obj1,'tank',20,'read') # 给函数传参
print(obj1.__dict__) # {'name': 'tank', 'age': 20, 'hobby': 'read'}
"""此方法 因考虑到定的功能只能给特定的对象添加独有数据兼容性还不够强"""
使用下列方法:
class Student:
school_name = '我是人'
def __init__(self, name, age, hobby):
self.name = name # self.__dict__['name'] = name
self.age = age
self.hobby = hobby
def choice_coures(self):
print('厕所功能')
obj1 = Student('tank', 20, 'read')
# 自动将对象传给函数的第一个参数self. == Student.init(obj1,'tank',20,'read')
print(obj1.__dict__) # {'name': 'tank', 'age': 20, 'hobby': 'read'}
print(obj1.age) # 也可以通过句点符获取数据 20
给不同的对象添加独有数据:
obj2 = Student('tony', 28, 'money')
print(obj2.__dict__) # {'name': 'tony', 'age': 28, 'hobby': 'money'}
print(obj2.age) # 28
给对象添加独有的功能
class Student:
school_name = '我是人'
def __init__(self, name, age, hobby):
self.name = name
self.age = age
self.hobby = hobby
# 即是对象的公共功能,也是对象的独有功能,谁来调谁就是主人公
def choice_coures(self):
print('厕所功能')
stu1 = Student('tank', 17, 'read')
在全局定义独有功能
def eat():
print('吃饭')
stu1.eat = eat # 给stu1 增加独有的功能,
print(stu1.__dict__) # {'name': 'tank', 'age': 17, 'hobby': 'read', 'eat': <function eat at 0x00000282192563A0>}
stu1.eat() # 调用功能 吃饭
'因定义在全局就不是独有的 所以应该放在类里'
类里定义的功能 会自动将对象 当做这个功能的第一个参数传给功能 , 谁来调就传谁
# 展示
类去调需要传参
Student.choice_coures(1) # 厕所功能
对象去调
"自动将对象当做第一参数传入,如果有多个形参,多了几个传几个"
stu1.choice_coures() # 厕所功能