zoukankan      html  css  js  c++  java
  • 面向对象基础

    一:面向对象

    【1】基础概念

    (1)面向过程:

      概念:面向过程是一种编程思想

      优点:

        (1)复杂的问题简单化 流程化

        (2)代码逻辑清晰

      缺点:

        (1)代码扩展性比较差 例如:当想添加新的功能的时候 需要修改大量的代码  

        (2)代码维护性比较差 例如:如果一个环节出现问题 会影响别的环节正常运行

    (2)面向对象:

      概念:

    (1)面向对象是一种编程思想,核心是对象

    (2)程序员 指挥对象帮我们进行工作

      

    案例一:

    # 大象装冰箱
    
    
    '''
    #面向过程
    
    1:首先打开冰箱
    2:将大象装入冰箱
    3:关上冰箱门
    
    '''
    
    '''
    # 面向过程
    
    找一个帮忙将大象装入冰箱
    
    '''
    大象装冰箱案例

    PS:其通过创造对象 帮我们解决问题

    案例二:

    # 西游记
    
    '''
    1:如来找唐僧四人去帮忙传经
    2:不同的人有不同的特征技能
    3:假如某人挂了不会影响其余人
    4:为了增加战斗力给孙悟空三根毫毛
    
    '''
    西游记案例

    PS:

    (1)通过对象帮忙工作 扩展性比较高

    (2)某一对象挂了 不会影响其余环节可维护性比较强

    (3)面向对象的优缺

      优点:

        (1)代码扩展性 可维护性都很高

        (2)对象都是单独存在的不会互相影响

        (3)某些对象可以被重复使用

      缺点:

        (1)不能向面向过程 准确知道结果

        (2)要设计对象之前 需要考虑对象的特征属性等 开发难度增加

     (4)使用场景

        (1):如果对于扩展性高的软件 使用面向对象编程 例如:qq V信 游戏

        (3):扩展性比较低的建议使用面向过程 例如:操作系统

       

    【2】类和对象:

    (1)类:

      概念:一组具有相同特征或属性的集合体

    例如:电子产品 ,食物,汽车等

    (2)对象:

    概念:

    (1)具体存在的事物 具备自己的行为和特征

    (2)其是特征和技能的结合体

    (3)类和对象的关系

      (1)对象属于某一个类

      (2)类是一系列对象的集合体

    PS:

    (1)在生活中先有对象 才能有类 例如:因为先有的人 人多了慢慢被定义成人类

    (2)在程序中必须先有类 才能有对象 因为计算机不知道对象拥有什么样的特征属性

    总结:在使用面向对象的时候 我们首先需要考虑 需要什么样的对象 该对象有什么特征 从而归纳总结这些特征 汇总成类

    (4)类和对象的创建:

    (1)类:

    # PS:类名尽量做到见面知意 使用大驼峰式 即第一个字母大写
    class Student:
        '''
        1 类中的属性 技能
        2 属性用变量定义
        3 技能哟函数定义
        '''
    print(Student) # <class '__main__.Student'>

    (2)对象:

    例如:

    stu = Student()
    
    stu = Student()  # <__main__.Student object at 0x00000000027F84A8>

    PS:

    (1)创建对象也是序列化的过程

    (2)序列化即类调用对象里传参的过程 传参个数必须相等

    例如:

    class Teacher:
        def __init__(self,name,age,gender):
            self.name = name
            self.age = age
            self.gender = gender
    
    stu1 = Teacher('SR',18,'male')
    print(stu1)        # <__main__.Teacher object at 0x00000000025E7518>
    print(stu1.name) # SR
    print(stu1.age) # 18

    (5)类在定义及被调用的过程:

      (1)定义阶段:

        (1)首先类在定义的时候会产生类的名称空间

        (2)执行类内部体代码 将类内部的产生的名字 放入类的名称空间

      (2)对象调用阶段:

        (1)首先会产生自己的名称空间

        (2)执行类内部的代码 将内部产生的名字放入自己的名称空间中

        (3)将类名称存入自己的名称空间中

    (6)属性的写法

      (1)类中的属性是公共的 

    例如:

    class Person:
    
        name = 'SR'
    
    p1 = Person()
    print(p1.name) # SR
    
    p2 = Person()
    print(p2.name) # SR

    # p1 与 p2 都能继承类中的属性

      (2)对象中的属性是自己独有的

    例如:

    class Person:
    
        name = 'SR'
    
    p1 = Person()
    p1.name = '张三'
    print(p1.name) # 张三
    
    
    p2 = Person()
    p2.name = '李四'
    print(p2.name) # 李四

    # 类中虽然有公有属性,但是都是继承自己独有的

    (7)类的访问顺序:

      (1)首先先访问自己独有的

      (2)访问公有的

      (3)独有的公有的都不存在 会报错

    例如:

    class Person:
    
        name = 'SR'
    
    p1 = Person()
    print(p1.name) # SR
    
    
    p2 = Person()
    p2.name = '李四'
    print(p2.name) # 李四
    
    # 将公有的注释
    p1 = Person()
    print(p1.name) # IndentationError: expected an indented block

    图解过程:

      

     (8)属性的增删改查

      (1)增加

    方法:对象变量名称.属性名称 = 属性值

    例如:

    class User:
    
        age = 18
    
    user = User()
    
    user.age = 20
    
    print(user.age)

     (2)删除

    方法 :del 对象的变量名称.属性名称 

    例如:

    class User:
    
        age = 18
    
    user = User()
    
    del user.age

     (3)修改

    方法:对象.属性 = 新的值 

    例如:

    class User:
    
        age = 18
    
    user = User()
    
    user.age = 20
    print(user.age) # user.age = 20

    (4)查看

    方法:print(对象.__dict__)

    例如:

    class User:
    
        age = 18
    
    user = User()
    
    user.age = 20
    print(user.__dict__) # {'age': 20}

    # 其只能查看对象内部的属性 不能查看类

    (9)初始化方法:

      (1)作用:为对象初始化赋值

    例如:

    class User_info:
        # 为对象赋值 名称 年龄
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    user = User_info('SR',18)
    print(user.age) # 18
    print(user.name) # SR
    
    print(user.__dict__) # {'name': 'SR', 'age': 18}

      (2)特点:

        (1)实例初始化会自动调用__init__方法

        (2)会将对象作为第一个参数传给self,self可以修改 但是不建议修改

        (3)其返回值为None 且不能修改 修改就会报错

    例如:

    class User_info:
        # 为对象赋值 名称 年龄
        def __init__(self,name,age):
            self.name = name
            self.age = age
            return 1 # __init__() should return None, not 'int'
    
    user = User_info('SR',18)
    print(user.age) # 18
    print(user.name) # SR
    
    print(user.__dict__) # {'name': 'SR', 'age': 18}

    PS:对象的精髓在于将数据与处理属于的函数绑定在一起 只要拿到对象就同时拿到需要被处理的数据以及处理数据的函数

    (10)绑定方法:

      (1)对象绑定方法

        作用:类内部函数可以访问对象内部的属性

    例如:

    class User_info:
        # 为对象赋值 名称 年龄
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def say_hello(self):
            print(self) # <__main__.User_info object at 0x0000000002807390>
            print('hello i am a student')
    
    
    stu = User_info('SR',18)
    # 调用类内部函数
    stu.say_hello() # hello i am a student
    print(stu) # <__main__.User_info object at 0x0000000002807390>

    PS:

    (1)虽然我能调用内部函数 但是想进行格式化输出 即想调用对象内部的数据

    (2)函数内部添加self 就是与那个对象进行数据交互 哪个对象调用函数 即self就为那个对象

    (3)既然self可以与对象进行数据交互 那么可以通过调用对象内部的数据 进行格式化输出

    例如:

    class User_info:
        # 为对象赋值 名称 年龄
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def say_hello(self):
            
            #调用对象
            print('hello i am a student %s'%self.name)
    
    
    stu = User_info('SR',18)
    # 调用类内部函数
    stu.say_hello() # hello i am a student SR

    PS:在使用调用函数的时候 其会将对象本身作为第一个参数 传入函数内部

    类调用:

    例如:

    class User_info:
        # 为对象赋值 名称 年龄
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def say_hello(self):
    
            #调用对象
            print('hello i am a student %s'%self.name)
    
    user = User_info('SR',18)
    
    User_info.say_hello()  # 报错 需要传入一个参数
    
    User_info.say_hello(1) # 报错 1这个对象中没有包含name参数
    
    User_info.say_hello(user) # hello i am a student SR

    PS:当使用类调用函数的时候 函数内部需要几个参数 就需要上传几个参数

      

    (2)类绑定方法:

      (1)作用:当类内部函数不需要对象内部数据 而需要类内部数据的时候需要用到该方法

    例如:

    class OldBoyStudent:
        school = "oldboy"
    
        def __init__(self,name):
            self.name = name
    
    
        def show_school(self):
    
            print(self.school)
    
    
    
    OldBoyStudent.show_school() # 报错 需要传个参数
    
    user = OldBoyStudent('SR')
    OldBoyStudent.show_school(user) # 正确

    PS:

    (1)此时对象都有一个共同点school 不需要再调用对象了

    (2)但是其需要我们上传对象 而我们不需要调用对象 直接调用函数内部的数据就行了

    解决办法:

    通过类绑定

    例如:

    class OldBoyStudent:
        school = "oldboy"
    
        def __init__(self,name):
            self.name = name
    
        # 开启类绑定
        @classmethod
        def show_school(cls):
            print(cls) # <class '__main__.OldBoyStudent'>
    
            print(cls.school)
    
    
    
    OldBoyStudent.show_school() # oldboy
    print(OldBoyStudent) # <class '__main__.OldBoyStudent'>

    (3)静态绑定方法

    作用:即不需要对象中的数据 也不需要类中的数据

    例如:

    class OldBoyStudent:
        school = "oldboy"
    
        def __init__(self,name):
            self.name = name
    
        # 开启非绑定方法
        @staticmethod
        def show_school():
    
            print('hello world')
    
    OldBoyStudent.show_school() # hello world
    
    print(OldBoyStudent) # # <class '__main__.OldBoyStudent'>
  • 相关阅读:
    [转]在efcore 中创建类 通过实现IEntityTypeConfiguration<T>接口 实现实体类的伙伴类 实现FluentApi
    jboss反序列化漏洞(CVE-2017-12149)
    第一阶段 3、javascript
    vue创建新项目
    vue引入git项目运行测试相关
    javascript基础知识梳理
    关于模式识别作业——利用分类器实现手写数字识别
    Guava 学习
    读书清单
    @JsonInclude(Include.NON_NULL)全局配置
  • 原文地址:https://www.cnblogs.com/SR-Program/p/11241440.html
Copyright © 2011-2022 走看看