zoukankan      html  css  js  c++  java
  • 面向对象编程——基于此思想写程序,初始化方法,属性查找

    一、面向过程编程VS面向对象编程

    面向过程编程:
    核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥
    基于该思想写程序就是在设计一条条的流水线

    优点:复杂的问题流程化、进而简单化
    缺点:扩展性差

    面向对象编程:
    核心是对象二字,对象是一个用来盛放数据与功能的容器
    基于该思想写程序就是在整合程序

    优点:可扩展性强
    缺点:编程的复杂度高
    软件不止于面向对象程序设计(解决可扩展性),还有其他方方面面

    二、如何基于面向对象的思想写程序

    # 例1
    # 学生的数据
    stu_name = "egon"
    stu_age = 18
    stu_gender = "male"
    
    # 学生的功能
    def choose(name, age, gender):
        print('%s:%s:%s 正在选课' % (name, age, gender))
    
    choose(stu_name,stu_age,stu_gender)
    # 例2:基于对象式的思想进行改写
    def choose(stu_self):
        print('%s:%s:%s 正在选课' % (stu_self["stu_name"], stu_self["stu_age"],stu_self["stu_gender"],))
    
    stu_obj = {
        "stu_name": "egon",
        "stu_age": 18,
        "stu_gender": "male",
        "choose":choose
    }
    
    print(stu_obj["stu_name"])
    stu_obj["choose"](stu_obj)
    python提供专门的语法来更漂亮地实现面向对象编程
    '''
    学生对象1
        数据:
    
            名字 = "冯疯子"
            年龄 = 18
            性别 = "female"
    
    学生对象2
        数据:
    
            名字 = "郭靖"
            年龄 = 19
            性别 = "male"
    
    学生对象3
        数据:
            名字 = "大雕"
            年龄 = 200
            性别 = "male"
    
    学生的类
        相同的数据
            学校 = "oldboy"
        相同的功能
            选课
    '''
    

    三、初始化方法

    对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体

    在程序中:务必保证先定义类,后产生对象

    调用函数会执行函数体代码返回的是函数体执行的结果,而调用类会产生对象,返回的是对象

    #例1
    # 类体代码会在类定义阶段立刻执行,然后将产生的名字都丢到类的名称空间中
    class Student:
        # 相同的数据
        school = "oldboy"
        # 相同的功能
        def choose(self):
            print("正在选课")
    
        # print('====>')
    
    stu_obj1=Student()
    stu_obj2=Student()
    stu_obj3=Student()
    
    stu_obj1.name = "冯疯子"  # stu1_obj1.__dict__["name"] = "冯疯子"
    stu_obj1.age = 18
    stu_obj1.gender = "female"
    
    stu_obj2.name = "郭靖"
    stu_obj2.age = 19
    stu_obj2.gender = "male"
    
    stu_obj3.name = "大雕"
    stu_obj3.age = 200
    stu_obj3.gender = "male"
    
    print(stu_obj1.name) #冯疯子
    stu_obj1.school = "xxx"#重新赋值
    print(stu_obj1.school) #xxx
    
    # print(Student.__dict__)
    print(stu_obj1.__dict__)#{'name': '冯疯子', 'age': 18, 'gender': 'female', 'school': 'xxx'}
    print(stu_obj2.__dict__)#{'name': '郭靖', 'age': 19, 'gender': 'male'}
    print(stu_obj3.__dict__)#{'name': '大雕', 'age': 200, 'gender': 'male'}
    #例2
    class
    Student: school = "oldboy" def choose(self): print("正在选课") print('===>') stu_obj1 = Student() stu_obj2 = Student() stu_obj3 = Student() def init(obj, x, y, z): obj.name = x obj.age = y obj.gender = z init(stu_obj1, "冯疯子", 18, "female") init(stu_obj2, "郭靖", 19, "male") init(stu_obj3, "大雕", 200, "male") print(stu_obj1.__dict__) print(stu_obj2.__dict__) print(stu_obj3.__dict__)
    class Student:
        school = "oldboy"
    
        #             空对象
        def __init__(obj, x, y, z):
            obj.name = x
            obj.age = y
            obj.gender = z
            # return None # 只能返回None,所以就不要写return了
    
        def choose(self):
            print("正在选课")
    
    # 调用类:
    # 1、创建一个空对象与类相关
    # 2、把空对象、"冯疯子", 18, "female"一起传给__init__方法,完成对象的初始化
    # 3、赋值符号把初始化好的对象的内存地址绑定变量名stu_obj1
    stu_obj1 = Student("冯疯子", 18, "female")
    stu_obj2 = Student("郭靖", 19, "male")
    stu_obj3 = Student("大雕", 200, "male")
    
    print(Student.__dict__)
    print(stu_obj1.__dict__)
    print(stu_obj2.__dict__)
    print(stu_obj3.__dict__)

    四、属性查找

    # 优先级
    # 先从对象的字典里找,没有,再去类的字典中找
    class Student:
        school = "oldboy"
    
        def __init__(obj, x, y, z):
            obj.name = x
            obj.age = y
            obj.gender = z
    
        def choose(self):
            print("%s 正在选课" %self.name)
    
    stu_obj1 = Student("冯疯子", 18, "female")
    stu_obj2 = Student("郭靖", 19, "male")
    stu_obj3 = Student("大雕", 200, "male")
    
    # 1、类中定义的数据是直接共享给所有对象使用的
    # print(id(stu_obj1.school))#地址相同
    # print(id(stu_obj2.school))#地址相同
    # print(id(stu_obj3.school))#地址相同
    # print(id(Student.school))#地址相同
    
    # Student.school="xxx"
    # print(stu_obj1.school)#xxx
    # print(stu_obj2.school)#xxx
    # print(stu_obj3.school)#xxx
    
    # print(Student.choose)#<function Student.choose at 0x00000000022DD430>地址不同
    # print(stu_obj1.choose)#<bound method Student.choose of <__main__.Student object at 0x0000000001DC5A00>>地址不同
    # print(stu_obj2.choose)#<bound method Student.choose of <__main__.Student object at 0x0000000001DDEA90>>地址不同
    # print(stu_obj3.choose)#<bound method Student.choose of <__main__.Student object at 0x0000000001DDECD0>>地址不同
    
    # 2、类中定义的函数是绑定给所有对象用的,绑定给谁就应该由哪个对象来调用
    # 对象.绑定方法()会把对象当作第一个参数传入
    #  类.函数()就是一个函数的玩法,没有自动传参的效果
    
    
    Student.choose(123123123)
    stu_obj3.choose()
    stu_obj2.choose()
    stu_obj1.choose()
  • 相关阅读:
    解决:RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 544 and 1935 in dimension 2 at ../aten/src/TH/generic/THTensor.cpp:711
    ubuntu16.04 notebook中(在anaconda的虚拟环境) 无法使用 anaconda的库
    多版本pip 指定下载
    Jmeter 使用-JDBC请求
    java基础函数
    Linux下安装bugfree
    linux下安装xampp
    Linux 常用命令
    Linux scp命令
    性能测试工具-Ngrinder使用之IDEA脚本开发环境配置
  • 原文地址:https://www.cnblogs.com/guojieying/p/13427003.html
Copyright © 2011-2022 走看看