zoukankan      html  css  js  c++  java
  • 面向对象介绍

    TOC

    面向对象

    一、什么是面向对象

    注意:编程思想仅仅是一门思想,与任何技术无关。

    面向对象是一门编程思想

    1.1 面向过程编程思想

    核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么

    基于该编程思想编写程序,就好比在设计一条工厂流水线,一种机械式的思维方式。

    • 优点
      • 将复杂的问题流程化,进而简单化
    • 缺点
      • 牵一发而动全身,程序的可扩展性差

    1.2 面向对象编程思想

    核心是对象二字,对象指的是特征与技能的结合体。

    基于该编程思想编写程序,就好比在创造世界,一种上帝式的思维方式。

    • 优点
      • 可扩展性高
    • 缺点
      • 编写程序的复杂程度比面向过程高

    二、如何产生对象

    产生对象前需要先了解什么是类

    2.1 什么是类

    类指的是类型、类别,是面向对象分析和设计的基石

    • 在两种角度去看待
      • 现实世界中
      • 先有一个个对象,经过社会的文明发展,产生抽象的类
      • 在程序中
      • 必须先有类,再通过调用类,产生对象


    对象是用来存放数据与功能的容器

    那么类则是用来存放多个对象相同的数据与功能的容器


    2.2 如何定义类

    面向对象的基本思路就是把程序中要用的、相关联度的数据与功能整合到对象里,然后再去使用,例如:学生,老师,课程等,显而易见的是:学生有学生相关的数据与功能,老师有老师相关的数据与功能,以学生为例:

    # 学生的数据有
    学校
    名字
    年龄
    性别
    
    # 学生的功能
    选课

    详细的

    # 学生1
    数据:
        学校=清华大学
        姓名=张三
        性别=男
        年龄=28
    功能:
        选课
    
    # 学生2
    数据:
        学校=清华大学
        姓名=韩梅梅
        性别=女
        年龄=18
    功能:
        选课
    
    # 学生3
    数据:
        学校=清华大学
        姓名=李四
        性别=男
        年龄=25
    功能:
        选课

    我们可以总结出一个学生类,用来存放学生们相同的数据与功能

    # 学生类
    相同特征:
        学校=清华大学
    相同功能:
        选课

    基于上述分析的结果,我们接下来需要做的就是在程序中定义出类,然后调用类产生对象

    class Student:  # 类的命名应该使用“驼峰体”
    
        school='清华大学'  # 数据
    
        def choose(self):  # 功能
            # 注意:在类内部定义函数,会默认有一个参数self
            print('%s is choosing a course' %self.name)

    def func(): # 函数名指向的是函数的内存地址

    class Student: # 类名指向的是类的内存空间

    2.2.1 函数的名称空间和类的名称空间的区别

    • 函数的名称空间
      • 在调用函数时产生,函数调用结束后销毁
    • 类的名称空间
      • 在定义阶段时产生,会将类中所有的名字,扔进类的名称空间

    三、什么是对象

    • 调用类拿到的返回值就是程序中的对象,或者称之为类的实例化
    • 对象是用来存放数据与功能的容器
    • 不同的对象虽然调用的是同一个类,但是每个对象中的内存地址是不一样的的,但类的数据是一样的
    # 定义类
    calss People:
        country = 'China'
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
        def learn(self):
            print('learnin....')
    
    
    # 调用类
    People()  # 调用类的方法:类名+()
    # 调用类返回的值就是对象
    p_obj = People()  # 此时p_obj就是对象

    2.3 类的操作

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

    调用类产生对象发生的事情:

        1、会产生一个空对象的名称空间
    
        2、会自动触发`__init__`,并且会将对象当做第一个参数传入
    
        3、会将调用类括号内的参数一并传给`__init__()`
    
    calss People:
        country = 'China'
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
        def learn(self):
            print('learnin....')

    四、类和对象的操作:增、删、查、改

    4.1 查看类和对象的名称空间

    类.__dict__ 对象.__dict__

    class People:
        country = 'China'
    
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
    
        def learn(self):
            print('learning.....')

    查看类的名称空间

    print(People.__dict__)
    
    
    {'__module__': '__main__', 'country': 'China', '__init__': <function People.__init__ at 0x00000257B37E3D38>, 'learn': <function People.learn at 0x00000257B37E3318>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
    # 可以看到返回类的名称空间中包含我们定义的country,init,learn等

    查看对象的名称空间

    p1 = People('tank', 16, 'male')
    print(p1.__dict__)
    
    {'name': 'tank', 'age': 16, 'sex': 'male'}

    4.2 类和对象的属性(类中的变量)操作

    4.2.1 查找类和对象的属性

    # 查找类的属性
    print(People.country)
    
    China
    
    # 查找对象的属性
    p1 = People('tank', 16, 'male')
    print(p1.name)
    
    tank

    4.2.2 增加类和对象中的属性

    # 增加类的属性
    People.number = 100000
    print(People.number)
    
    100000
    
    # 增加对象中的属性
    p1 = People('tank', 16, 'male')
    p1.sal = 8000
    print(p1.sal)
    
    8000

    4.2.3 修改类和对象中的属性

    # 修改类的属性
    People.country = '中国'
    print(People.country)
    
    
    中国
    
    
    # 修改对象的属性
    p1 = People('tank', 16, 'male')
    p1.name = 'sean'
    print(p1.name, p1.age, p1.sex)
    
    
    sean 16 male

    4.2.4 删除类和对象中的属性

    # 删除类的属性
    del People.country
    print(People.country)
    
    AttributeError: type object 'People' has no attribute 'country'
    
    # 删除对象的属性
    p1 = People('tank', 16, 'male')
    del p1.name
    print(p1.name, p1.age, p1.sex)
    
    AttributeError: 'People' object has no attribute 'name'

    五、类中的数据属性(类中的变量)

    类中的属性是给对象使用的

    p_obj1 = People('tank', 17, 'male')
    p_obj2 = People('jason', 71, 'female')
    p_obj3 = People('大饼', 72, 'female')
    
    print(p_obj1)
    print(p_obj2)
    print(p_obj3)
    
    <__main__.People object at 0x0000025FBA358C48>
    <__main__.People object at 0x0000025FBA358C88>
    <__main__.People object at 0x0000025FBA358CC8>
    
    # 注意:不同的对象,内存地址是不一样的

    对象引用类中的属性,指向的都是类中同一个内存地址

    print(p_obj1.country, id(p_obj1.country))
    print(p_obj2.country, id(p_obj2.country))
    print(p_obj3.country, id(p_obj3.country))
    
    
    China 1551817278384
    China 1551817278384
    China 1551817278384

    六、类中的方法(类中的函数)

    类中方法是给对象使用的

    由不同的对象来调用就会将方法绑定给不同的对象,并且会将对象当做第一个参数传入。

    print(People)
    print(p_obj1.learn, id(p_obj1.learn))
    print(p_obj2.learn, id(p_obj2.learn))
    print(p_obj3.learn, id(p_obj3.learn))
    
    
    <class '__main__.People'>
    <bound method People.learn of <__main__.People object at 0x0000020FC47F8C88>> 2266592990536
    <bound method People.learn of <__main__.People object at 0x0000020FC47F8CC8>> 2266592990536
    <bound method People.learn of <__main__.People object at 0x0000020FC47F8D08>> 2266592990536

    每个不同对象调用类中方法的时候,每个对象指向的内存ID不一样,pycharm中有优化机制,所以相同

    七、对象属性的查找顺序

    先从对象自己名称空间中查找 ---> 类的名称空间

    八、对象绑定方法的特殊之处

    • 会将对象当做第一个参数传入
    • 若对象的绑定方法中还有其他参数,会一并传入
    calss People:
        country = 'China'
        def __init__(self, name, age, sex):
            self.name = name
            self.age = age
            self.sex = sex
        def learn(self):  # 在类中就是方法(类中的函数)
            print('learnin....')
    
    
    p_obj1 = People()
    p_obj.learn()   # 对象绑方法就是对象调用类中的函数

    九、一切皆对象

    在python3中,类即类型。

    print(type(str1))
    
    <class 'str'>
    
    
    l1 = [1, 2, 3]
    print(l1)
    
    <class 'list'>




  • 相关阅读:
    hdu1425
    iOS 纯代码跳转到Xib界面和Storyboard界面
    iOS 获取当前app的 App Store 版本号
    iOS 延时方法,定时器。等待一段时间在执行
    iOS获取当前app的名称和版本号及其他信息(持续维护)
    iOS 截取字符串(持续更新)截取、匹配、分隔
    iOS 屏幕大小尺寸,分辨率,代码获取屏幕大小(持续维护添加)
    iOS NSString只保留字符串中的数字
    iOS NSlog打印数据不完全,xcode处理办法
    iOS Xcode 10.3 xib:-1:未能找到或创建描述的执行上下文“<IBCocoaTouchPlatformToolDescript
  • 原文地址:https://www.cnblogs.com/cnhyk/p/11929467.html
Copyright © 2011-2022 走看看