• python基础语法14 面向对象


    面向对象

    1.什么是面向对象?
        面向对象是一门编程思想!
    
        - 面向过程编程思想:
            核心是 “过程” 二字,过程指的是解决问题的步骤,即先干什么再干什么!
            基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。
    
            优点:
                将复杂的问题流程化,进而简单化
            缺点:
                牵一发而动全身,程序的可扩展性差。
    
        注意: 编程思想仅仅是一门思想,与任何的技术无关。
    
        - 面向对象编程思想:
            注意: 要将自己当做一个上帝!!!
            核心是 “对象” 二字,对象指的是 “特征与技能” 的结合体。
            基于该编程思想编写程序,就好比在创造世界,一种 “上帝式” 的思维方式。
    
            优点:
                可扩展性高。
            缺点:
                编写程序的复杂程度比面向过程高。
    
    2.如何产生对象:
        1) 什么是类?
            类指的是类型、类别。
    
            - 在两种角度去看待:
                - 现实世界中:
                    - 先有一个个的对象,经过社会的文明发展,随之总结出类。
                    对象是实际存在的,而类抽象产生的。
    
                - 在程序中:
                    - 必须先有类,再通过“调用类,产生对象”。
    
            对象指的是 “特征与技能” 的结合体, 类指的是一系列 “对象之间相同的特征与技能” 的结合体。
    
        2) 如何定义类:
            - 如何写类并产生对象:
                - 先从现实世界中通过一个个对象总结出类。
                - 然后再定义类,后调用类产生对象。
    
            - 比如: 选课系统:
                - 选课系统学生类:
                    - 学生对象1:
                        特征:
                            - 姓名: 胡晨阳
                            - 性别: female
                            - 年龄: 95
                            - 学校: oldboy
    
                        - 技能:
                            - 技术: python
                            - 学习: learn
                            - 选课: course
                    - 学生对象2:
                        特征:
                            - 姓名: 高弟
                            - 性别: female
                            - 年龄: 98
                            - 学校: oldboy
                        - 技能:
                            - 技术: python
                            - 学习: learn
                            - 选课: course
    
    
        3) 定义类语法:
            class 关键字: 帮你产生类的。
    
            class 类的名字:
                - 对象之间相同的特征
                    - 学校
                    school = 'oldboy'
    
                - 对象之间相同的技能
                    - python
                        def python():
                            pass
                    - learn
                        def learn():
                            pass
                    - course
                        def course():
                            pass

    class 类名:
      特征
      技能

    定义类名的规范:
      - 驼峰命名法

    # 定义老男孩学生类
    class OldboyStudent:  # 类名指向的是类的内存地址
        # 学生相同的特征
        # 在类中的特征 也称之为 “属性” attribute
        school = 'oldboy'
    
        # 学生相同的技能
        # 注意: 在类内部定义函数,会默认有一个参数self
        def learn(self):  # self此时当做一个形参
            print('learning....')
    
    print(OldboyStudent)  # <class '__main__.OldboyStudent'>
    
    # 查看类的名称空间  类.__dict__    对象.__dict__
    print(OldboyStudent.__dict__)
    print(OldboyStudent.__dict__['school'])
    print(OldboyStudent.__dict__['learn'])
    OldboyStudent.__dict__['learn'](123)
    
    # 类提供一种特殊获取名字的方式  “类名.名字” 的方式
    #
    print(OldboyStudent.school)
    OldboyStudent.learn('tank')
    
    #
    OldboyStudent.school = 'OldGirl'
    print(OldboyStudent.school)
    
    #
    del OldboyStudent.school
    
    #
    OldboyStudent.school = 'Oldboy'
    print(OldboyStudent.school)
    OldboyStudent.old_student = 'HuChenYang'
    print(OldboyStudent.old_student)
    
    
    '''
    - 函数的名称空间:
        在调用函数时产生,函数调用结束后销毁。
        
    - 类的名称空间:
        在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。
    '''

    对象

    对象的产生:
      - 调用类产生对象

      类名 + () 调用类产生对象

      类的名称空间在定义时产生,对象的名称空间在调用类时产生。

      调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。

    class Student:
        # 学校
        school = 'oldboy'
    
        # 学习技能   ----> method ---》 方法
        def learn(self):
            print(self)  # 注意:看到self就应该知道是对象本身
            print('learning...')
    
    
    stu1 = Student()
    stu2 = Student()
    stu3 = Student()
    # print(Student)  #
    # print(Student.school, 'Student...')
    print(Student.learn, 'Student...')  #<function Student.learn at 0x00000000025789D8> Student...
    Student.learn(123)  #123
    print('=' * 100)
    
    print(stu1)  # <__main__.Student object at 0x0000017BFF8A5898>
    # print(stu1.school, 'stu1...')
    print(stu1.learn, 'stu1...')    # learning...
    # print(stu1)
    # 对象调用方法时: 会将对象当做第一个参数传入方法中。
    stu1.learn()  #
    
    print('=' * 100)
    print(stu2)  # <__main__.Student object at 0x0000017BFF8A5898>
    # print(stu2.school, 'stu2...')
    print(stu2.learn, 'stu2...')
    stu2.learn()
    
    print('=' * 100)
    print(stu3)  # <__main__.Student object at 0x0000017BFF8A5898>
    # print(stu3.school, 'stu3...')
    print(stu3.learn, 'stu3...')
    stu3.learn()

    由对象来调用类内部的函数,称之为对象的绑定方法。
      对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。

    class Student:
        # 学校
        school = 'oldboy'
    
        def __init__(self, name, sex, age):  # stu1, 'tank', 'male', 17
            print(self.__dict__)
    
            # 给对象添加新的属性
            self.name = name  # stu1.x = 'tank'
            self.sex = sex  # stu1.y = 'male'
            self.age = age  # stu1.z = 17
    
            # 查看当前对象的名称空间
            print(self.__dict__)
    
        # 学习技能   ----> method ---》 方法
        def learn(self):
            print(self)  # 注意看到self就知道是对象本身
            print('learning...')
    '''结果
    {'__module__': '__main__', 'school': 'oldboy', '__init__': <function Student.__init__ at 0x00000000025989D8>, 'learn': <function Student.learn at 0x0000000009BD1730>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
    {}
    {'name': 'ldc', 'sex': 'female', 'age': 18}
    江鹏 female 84
    '''
    # **** 想要在调用类时,为对象传入对象独有 特征
    # ***** __init__(self, name, sex, age):  # name---> tank ,  sex---> male,  age----> 17
    # 调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__()
    # stu1 = Student('tank', 'male', 17)
    
    # 注意: 凡是在类内部定义的,__开头或者__结尾的方法都有特殊的意义。
    # 在类内部定义的方法,在调用类时触发,会自动将对象本身当做第一个参数自动传入, 与括号内所有的参数一并传给__init__()。
    # __init__(self):

    对象名字的查找顺序: *******
      1.对象.属性,会先找对象自己的。
      2.若对象没有,会去找类的。
      3.若类没有,则会报错。

    class People:
        country = 'China'
        name = 'jason'
        def __init__(self,name,age,sex):
            self.name = name
            self.age=age
            self.sex=sex
        def fun(self):
            print('running...')
    
    obj1 = People('tank',17,'male')
    print(obj1.name)    # tank  找对象自己的name属性
    print(obj1.country) # China  对象没有,找类中的属性
    # print(obj1.jason)   # AttributeError: 'People' object has no attribute 'jason'
    print(obj1.__dict__)    #{'name': 'tank', 'age': 17, 'sex': 'male'}
    # 给对象的名称空间添加 country='中国' 属性
    obj1.country = '中国'
    print(obj1.__dict__)    # {'name': 'tank', 'age': 17, 'sex': 'male', 'country': '中国'}
    print(People.__dict__)
    # {'__module__': '__main__', 'country': 'China', 'name': 'jason', '__init__': <function People.__init__ at 0x00000000025989D8>, 'fun': <function People.fun at 0x0000000009BD1730>,
    # '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
    print(obj1.country) # 中国

    在python中一切皆对象。

    number = 10   # int(10)  ----> __init__(number, 10)
    int(10)
    # l1 ---> list对象
    l1 = list([1, 2, 3])
    dict()
    tuple((1, 2, 3))
    float
    str
    set
    bool
    enumerate
    bytes
    filter

    人狗大作战

    # 人类
    class People:
    
        def __init__(self, name, life, arg):
            self.name = name
            self.life = life
            self.arg = arg
    
        # 人调用bite时,传入狗对象
        def bite(self, dog_obj):
            print(f'人:[{self.name}] 开始 咬 狗:[{dog_obj.name}]!')
    
            # 减掉狗对象中的生命值  值为人的攻击力
            dog_obj.life -= self.arg
            print(f'狗的生命值减掉: [{self.arg}], 还剩狗的血量: [{dog_obj.life}]')
    
            if dog_obj.life <= 0:
                print(f'狗[{dog_obj.name}]已经挂了')
                return True
    
    # 狗类
    class Dog:
        def __init__(self, name, life, dog_type, arg):
            self.name = name
            self.dog_type = dog_type
            self.life = life
            self.arg = arg
    
        # 狗对象调用bite时,传入人对象
        def bite(self, p_obj):
            print(f'狗:[{self.name}] 开始 咬人:[{p_obj.name}]!')
    
            # 减掉人对象中的生命值  值为狗的攻击力
            p_obj.life -= self.arg
            print(f'人的生命值减掉: [{self.arg}], 还剩人的血量: [{p_obj.life}]')
    
            if p_obj.life <= 0:
                print(f'人[{p_obj.name}]已经挂了')
                return True
    
    p1 = People('高弟', 2000, 500)
    d1 = Dog('HCY', 250, '哈士奇', 2500)
    
    p2 = People('高弟2', 5000, 50)
    import time
    
    while True:
        # 开始人狗互咬
        # if p1.life or d1.life:
        res1 = d1.bite(p2)
    
        if res1:
            break
    
        time.sleep(1)
        res2 = p1.bite(d1)
    
        if res2:
            break
    
        time.sleep(1)

    总结:

    面向对象编程:
      核心是 “对象”, 对象指的是 特征与技能 结合体。
      基于该编程思想编写程序,就好比在创造世界,一种上帝式思维方式。

      优点:
        可扩展性强。

      缺点:
        编写复杂难度较面向过程高。

    1.类的实例化: 调用类的过程称之为类的实例化,产生的对象也可以称之为类的一个实例

    调用类产生对象发生的事情:
      1.会产生一个空对象的名称空间
      2.会自动触发__init__,并且会将对象当做第一个参数传入。
      3.会将调用类括号内的参数一并传给__init__().

    2.查看类与对象的名称空间 类.__dict__   对象.__dict__

    3.类或对象的属性操作: 查、增、改、删

    4.类中数据属性(类中的变量): 类中属性是给对象使用的,对象引用类中的属性,指向的都是类中同一个内存地址。

    5.类中的方法(类中的函数): 类中的方法是给对象使用的,
    由不同的对象来调用就会将方法绑定给不同的对象, 并且会将对象当做第一个参数传入。

    6.对象属性的查找顺序: 先从对象自己名称空间中查找 ---》 类的名称空间中查找

    7.对象绑定方法的特殊之处:

      1.会将对象当做第一个参数传入。******
      2.若对象的绑定方法中还有其他参数,会一并传入。

    8.一切皆对象: 在python3中,类即类型。

  • 相关阅读:
    搭建CDH的yum本地源
    搭建一个离线yum源
    VMware主机 几次断电后,挂载的磁盘报错了,系统无法启动
    vm workstation15 迁移至ESXi6.7步奏
    ESXi6.7在 ASUS PRIME B360-PLUS 主板上安装报错
    php常用函数
    PHP函数
    php语句
    TSQL语句练习题
    php的基础
  • 原文地址:https://www.cnblogs.com/ludingchao/p/11929470.html
Copyright © 2020-2023  润新知