面向对象

面向对象

编程思想

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()  # 厕所功能
posted @ 2022-11-02 21:12  李阿鸡  阅读(24)  评论(0编辑  收藏  举报
Title