zoukankan      html  css  js  c++  java
  • 面向对象编程

    一、面向对象编程

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

    优点:解决了程序的扩展性

    缺点:编写程序的复杂度高,可控性差

    面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。

    二、类与对象

    1、什么是类

    类指的是类型,类别,是具有相同的特征和技能的一类事物就是类,对象指的是特征与技能的结合体,在现实世界中,先有一个个的对象,总结出类。在程序中,必须先有类,再通过调用类,产生对象。对象是实际存在的,类是抽象产生的

    2、如何定义类

    比如: 选课系统:
                - 选课系统学生类:
                    - 学生对象1:
                        特征:
                            - 姓名: 张三
                            - 性别: 男
                            - 年龄: 23
                            - 学校: oldboy
    
                        - 技能:
                            - 技术: python
                            - 学习: learn
                            - 选课: course
    
                    - 学生对象2:
                        特征:
                            - 姓名: 李四
                            - 性别: 男
                            - 年龄: 27
                            - 学校: oldboy
    
                        - 技能:
                            - 技术: python
                            - 学习: learn
                            - 选课: course

    先从现实世界中通过一个个对象总结出类,然后再定义类,后调用类产生对象。

    定义类语法:
            class 关键字: 帮你产生类的。
    
            class 类的名字:
                - 对象之间相同的特征
                    - 学校
                    school = 'oldboy'
    
                - 对象之间相同的技能
                    - python
                        def python():
                            pass
    
                    - learn
                        def learn():
                            pass
    
                    - course
                        def course():
                            pass

    3、类的使用

    '''
    class 类名:
        特征
        技能
    
    定义类名的规范:
        - 驼峰命名法
    
    '''
     1 def foo():  # 函数名指向的是函数的内存地址
     2     pass
     3 
     4 
     5 print(foo)  # <function foo at 0x000001CDFF119048>
     6 
     7 
     8 # 定义老男孩学生类
     9 class OldboyStudent:  # 类名指向的是类的内存地址
    10     # 学生相同的特征
    11     # 在类中的特征 也称之为 “属性” attribute
    12     school = 'oldboy'
    13 
    14     # 学生相同的技能
    15     # 注意: 在类内部定义函数,会默认有一个参数self
    16     def learn(self):  # self此时当做一个形参
    17         print('learning....')
    18 
    19 
    20 print(OldboyStudent)  # <class '__main__.OldboyStudent'>
    21 
    22 # 查看类的名称空间
    23 print(OldboyStudent.__dict__)
    24 print(OldboyStudent.__dict__['school'])
    25 print(OldboyStudent.__dict__['learn'])
    26 OldboyStudent.__dict__['learn'](123)
    27 
    28 
    29 # 类提供一种特殊获取名字的方式  “类名.名字” 的方式
    30 #
    31 print(OldboyStudent.school)
    32 OldboyStudent.learn('tank')
    33 
    34 #
    35 OldboyStudent.school = 'OldGirl'
    36 print(OldboyStudent.school)
    37 
    38 #
    39 del OldboyStudent.school
    40 
    41 #
    42 OldboyStudent.school = 'Oldboy'
    43 print(OldboyStudent.school)
    44 OldboyStudent.old_student = 'HuChenYang'
    45 print(OldboyStudent.old_student)
    '''
    - 函数的名称空间:
        在调用函数时产生,函数调用结束后销毁。
        
    - 类的名称空间:
        在定义阶段时产生,会将类中所有的名字,扔进类的名称空间中。
    '''

    4、对象

    '''
    对象的产生:
        - 调用类产生对象
    
        类名 + () 调用类产生对象
    
        类的名称空间在定义时产生,对象的名称空间在调用类时产生。
    
        调用类产生对象的过程称之为类的实例化,对象称之为类的一个实例。
    '''
     1 class Student:
     2     # 学校
     3     school = 'oldboy'
     4 
     5     # 学习技能   ----> method ---》 方法
     6     def learn(self):
     7         print(self)  #
     8         print('learning...')
     9 
    10 stu1 = Student()
    11 stu2 = Student()
    12 stu3 = Student()
    13 print(Student)  #
    14 print(Student.school, 'Student...')
    15 print(Student.learn, 'Student...')
    16 Student.learn(123)
    17 print('=' * 100)
    18 
    19 print(stu1)  # <__main__.Student object at 0x0000017BFF8A5898>
    20 print(stu1.school, 'stu1...')
    21 print(stu1.learn, 'stu1...')
    22 print(stu1)
    23 # 对象调用方法时: 会将对象当做第一个参数传入方法中。
    24 stu1.learn()  #
    25 
    26 print('=' * 100)
    27 print(stu2)  # <__main__.Student object at 0x0000017BFF8A5898>
    28 print(stu2.school, 'stu2...')
    29 print(stu2.learn, 'stu2...')
    30 stu2.learn()
    31 
    32 print('=' * 100)
    33 print(stu3)  # <__main__.Student object at 0x0000017BFF8A5898>
    34 print(stu3.school, 'stu3...')
    35 print(stu3.learn, 'stu3...')
    36 stu3.learn()
    '''
    由对象来调用类内部的函数,称之为对象的绑定方法。
        对象的绑定方法特殊之处: 会将对象当做第一个参数传给该方法。
    '''
     1 class Student():
     2     # 学校
     3     school = 'oldboy'
     4 
     5     # 给对象添加新的属性
     6     def __init__(self, name, age, sex):
     7         print(self.__dict__)
     8 
     9         self.name = name
    10         self.age = age
    11         self.sex = sex
    12 
    13         # 查看当前类的名称空间
    14         print(self.__dict__)
    15 
    16     # 公共方法
    17     def learn(self):
    18         print(self)
    19         print('learning...')
    20 
    21 
    22 # 查看类的名称空间
    23 print(Student.__dict__)
    24 
    25 # stu1 = Student()  # Student(stu1)  ---> __init__(self)  ----> self == stu1
    26 # stu2 = Student()  # Student(stu2)  ---> __init__(self)  ----> self == stu2
    27 # stu3 = Student()  # Student(stu3)  ---> __init__(self)  ----> self == stu3
    28 #
    29 # stu1.name = '张三'
    30 # stu1.age = 25
    31 # stu1.sex = '男'
    32 # print(stu1.name, stu1.age, stu1.sex)
    33 
    34 stu1 = Student('李四', 27, '')
    35 print(stu1)
    36 print(stu1.name, stu1.age, stu1.sex)

    想要在调用类时,为对象传入对象独有的特征,需要用到绑定方法__init__

    # __init__(self, name, sex, age):  # name---> 张三 ,  sex---> 女,  age----> 27
    # 调用类时: 会将对象当做第一个参数,与括号内所有的参数一并传给__init__()
    # stu1 = Student('李四', 27, '女')

    在python中,一切皆对象,包括我们之前所学的数据类型例如

    num = 10 ----> num = int(10),int就是一个类

    list1 = [1, 2, 3] ----> list1 = list([1, 2, 3]),list也是一个类

    对象名字的查找顺序:

      - 对象.属性,会先找对象自己的

      - 若对象没有,会去找类的

      - 若类没有,就会报错

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

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

  • 相关阅读:
    针对当前用户 对方法加锁
    二叉树
    return与析构续
    return与析构函数
    拷贝构造函数
    引用
    返回引用的函数值和参数的引用
    使用引用返回函数值
    邻接表--图 部分代码
    dec,hex and oct
  • 原文地址:https://www.cnblogs.com/hexianshen/p/11928860.html
Copyright © 2011-2022 走看看