• 面向对象编程,其属性特性,用法等


    在PYTHON 海洋畅游

    面向对象编程

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

    • 面向对象的基本思路就是把程序中要用到的、相关联的数据与功能整合到对象里,
    • 然后再去使用,但程序中要用到的数据以及功能那么多,如何找到相关连的呢?
    • 我需要先提取选课系统里的角色:学生、老师、课程等,然后显而易见的是:
    • 学生有学生相关的数据于功能,老师有老师相关的数据与功能,我们单以学生为例,

    例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 = {
        "school" = "oldboy"
        "stu_name": "egon",
        "stu_age": 18,
        "stu_gender": "male",
        "choose":choose
    }
    
    # print(stu_obj["stu_name"])
    stu_obj["choose"](stu_obj)
    
    • 上述的代码,就是我们最最简单的面向对象刚入门的时候所编写的程序
    • 我们能不能在此基础上在进行一些优化呢。例如我们将它的一些共有的东西放到另外的字典去,当做公共使用的一个字典。

    例3:基于python提供专门的语法来更漂亮地实现面向对象编程

    • 我们把独有数据和共有数据分开
    学生对象1
        数据:
            名字 = "冯疯子"
            年龄 = 18
            性别 = "female"
    学生对象2
        数据:
            名字 = "郭靖"
            年龄 = 19
            性别 = "male"
    学生对象3
        数据:
            名字 = "大雕"
            年龄 = 200
            性别 = "male"
    学生的类
        相同的数据
            学校 = "oldboy"
        相同的功能
            选课
    

    我们python中有一个class 方法可以帮我们去生成一个类去和对象进行关联的。

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

    class Student: # 类的命名应该使用“驼峰体”
        school='oldboy' # 数据
        def choose(self): # 功能
            print('%s is choosing a course' %self.name)
    

    类体最常见的是变量的定义和函数的定义,但其实类体可以包含任意Python代码,类体的代码在类定义阶段就会执行,因而会产生新的名称空间用来存放类中定义的名字,可以打印Student.__dict__来查看类这个容器内盛放的东西

    print(Student.__dict__)
    {..., 'school': 'oldboy', 'choose': <function Student.choose at 0x1018a2950>, ...}
    

    调用类的过程称为将类实例化,拿到的返回值就是程序中的对象,或称为一个实例

    stu_obj1=Student() # 每实例化一次Student类就得到一个学生对象
    stu_obj2=Student()
    stu_obj3=Student()
    

    全代码案例:

    class Student:
        # 相同的数据
        school = "oldboy"
    
        # 相同的功能
        def choose(self):
            print("正在选课")
    
        # print('====>')
    
    stu_obj1=Student() # 每实例化一次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(Student.__dict__)
    print(stu_obj1.__dict__)
    print(stu_obj2.__dict__)
    print(stu_obj3.__dict__)
    

    结果:

    {'__module__': '__main__', 'school': 'oldboy', 'choose': <function Student.choose at 0x000001ABEE3D5790>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
    {'name': '冯疯子', 'age': 18, 'gender': 'female'}
    {'name': '郭靖', 'age': 19, 'gender': 'male'}
    {'name': '大雕', 'age': 200, 'gender': 'male'}
    
    • 我们针对,上述我们所写好的代码去修改一下,将其精简一下。
    • 针对其对对象的修改我们将其简化一下,利用函数去简化。

    结果如下:

    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')
    
    • 看似这个代码已经很简洁了
    • 但是我们将函数放在 定义类的里面,那么我们就可以更加简洁了。

    方案三:

    class Student:
        school = "oldboy"
        #             空对象
        def __init__(obj, x, y, z):
            obj.name = x
            obj.age = y
            obj.gender = z
            # return None # 只能返回None
        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(stu_obj1.__dict__)
    
    • 像这样修改了以后我们就可以更加简洁了,从几十行简洁成了十几行。

    2, 类中需要注意的事项

    类的使用步骤:

    ① 在程序中使用时必须先定义类:即申请内存空间,将对象之间相同的数据与功能存放起来,类名指向该名称空间
    	与函数不同,类在定义的时候就会立即执行类的代码,运行过程中产生的名字会丢进类的名称空间中
    ② 调用类来产生对象,调用类的过程被称之为实例化,
    本质上调用类就是产生一个与类相关联的子空间
    

    一.在类中定义的函数是需要输入值的。

    class Student:
        school = "oldboy"
        #             空对象
        def __init__(obj, x, y, z):
            obj.name = x
            obj.age = y
            obj.gender = z
            # return None # 只能返回None
        def choose(self):
            print("正在选课")
    #第9行就可以看出。 我们必须把参数传进去才能调用。
    

    二.我们需要了解,类和对象之间的关系

    在这里插入图片描述

    在内存空间中我们会刷出一个类的内存空间,然后我们在内存空间中放置的是公共数据和公共方案。

    我们创建类以后,调用类,我们就会创建新的内存空间去存放对象的独有数据,而且对象可以找到类中的共有数据。

    三 使用类的__init__方法可以完成对空对象的初始化

    class Student:
        school = "外婆交大"
        def __init__(obj, x, y, z):
            obj.name = x
            obj.age = y
            obj.gender = z
           
        def choose_course(self):
            print("正在选课")
    

    注意点:定义在类内的函数,不能有非None的返回值,不然会与类返回的对象产生冲突

    四 调用类的步骤:

    ① 先创建一个与类相关联的子空间
    ② 自动触发__init__方法,将name,age,gender等一起传给__init__方法,完成空对象的初始化
    ③ 返回一个初始化好的对象,用赋值符号将对象的内存地址绑定给stu1这种变量名
    123
    

    五 调用类产生对象

    stu1 = Student('jason', 18, 'male')
    stu2 = Student('jimmy', 19, 'male')
    stu3 = Student('red', 20, 'female')
    

    3, 属性操作

    一 查找优先级

    对象调用属性会先从对象字典里找,找不到就去类的字典里找

    stu1.choose_course()  # 调用类里的函数,等同于choose_course(stu1)
    1
    

    二 类属性操作

    类与对象都可以用.来访问属性并完成增删改查的操作
    ① 访问类的数据属性
    可以作出修改,改完后,所有的对象调用时全都会跟着改

    Student.school = "贱桥大学"  # 调用数据属性,并作出修改
    1
    

    ② 访问类的函数属性
    类.函数名()的方式调用函数,就是一个普通的函数调用方法,不会自动传入self参数,需要手动添加

    Student.choose_course(stu1)  # 调用函数choose_course
    1
    

    三 属性操作

    ① 类中定义的数据属性就是共享给所有对象使用的,所有对象访问的是同一个内存地址
    ② 类定义的函数是绑定给所有对象使用的,
    对象调用函数会将对象作为第一个参数传入(即自动传入self参数)

    stu1.choose_course()  # 不需要手动传入self参数
    
    努力学习!
  • 相关阅读:
    HDU 3586 Information Disturbing (树形DP+二分)
    HDU 6053 TrickGCD (莫比乌斯函数)
    51Nod 1554 欧姆诺姆和项链 (KMP)
    HDU 6153 A Secret (KMP)
    HDU 6156 Palindrome Function (数位DP)
    HDU 6148 Valley Numer (数位DP)
    UVa 1513 Movie collection (树状数组)
    HDU 6125 Free from square (状压DP+背包)
    UVa 10766 Organising the Organisation (生成树计数)
    tensorflow 待阅读的资料
  • 原文地址:https://www.cnblogs.com/Orange-YXH/p/13648108.html
Copyright © 2020-2023  润新知