zoukankan      html  css  js  c++  java
  • 1-[面向对象]-基础

    1、编程范式

    •  编程是 程序 员 用特定的语法+数据结构+算法 组成的代码来告诉计算机如何执行任务的过程 。
    • 两种最重要的编程范式分别是
      •   面向过程编程
      •   面向对象编程

    2、面向过程编程(Procedural Programming)

     

    """实现一个用户注册功能"""
    # 1.用户输入
    # 2.验证是否符合标准
    # 3.注册
    
    
    def enter():
        username = input('>:').strip()
        password = input('>:').strip()
        return {
            'username': username,
            'password': password
                }
    
    
    def check(user_info):
        is_valid = True
        if len(user_info['username']) == 0:
            print('用户名不能为空')
            is_valid = False
        if len(user_info['password']) < 6:
            print('密码不能少于6个字符')
            is_valid = False
        return {
            'is_valid': is_valid,
            'user_info': user_info
        }
    
    
    def register(check_info):
        if check_info['is_valid']:
            import json
            with open('users.txt', 'w', encoding='utf-8') as f:
                json.dump(check_info['user_info'], f)
            print('注册成功')
    
    
    def main():
        user_info = enter()
        check_info = check(user_info)
        register(check_info)
    
    
    if __name__ == '__main__':
        main()

    如果添加一个新功能:邮箱验证

    • 可扩展性差

      

    3、面向对象编程

     

    4.定义类与实例化出对象

    """
    类就是一系列对象相似的特征与技能的结合体
    强调:站在不同的角度,得到的分类是不一样的
    
    在现实世界中:一定先有对象,后有类
    在程序中,一定先定义类,后强调类来产生对象
    
    站在路飞city的角度,大家都是学生
    
    在现实世界中:
        对象1:张三
            特征:
                学校='luffycity'
                名字='张三'
                性别='女'
                年龄=18
            技能:
                学习
                吃饭
                睡觉
        对象2:李四
            特征:
                学校='luffycity'
                名字='李四'
                性别='男'
                年龄=28
            技能:
                学习
                吃饭
                睡觉
        对象3:王五
            特征:
                学校='luffycity'
                名字='王五'
                性别='女'
                年龄=38
            技能:
                学习
                吃饭
                睡觉
    
    
    总结现实中路飞city的学生类
        相似的特征:
            学校=’luffycity‘
    
        相似的技能
            学习
            吃饭
            睡觉
    
    """
    # 先定义类
    class LuffyStudent:
        school = 'Luffycity'
    
        def learning(self):
            print('is learning')
    
        def eating(self):
            print('is eating')
    
        def sleep(self):
            print('is sleeping')
    
    # 后产生对象
    stu1 = LuffyStudent()
    stu2 = LuffyStudent()
    stu3 = LuffyStudent()
    print(stu1)
    print(stu2)
    print(stu3)

     

    4、如何使用类

       

    (1)查看类的命名空间

    # 查看类的命名空间
    print(LuffyStudent.__dict__)
    print(LuffyStudent.__dict__['school'])
    print(LuffyStudent.__dict__['eating'])
    

      

    运行结果
    {'learning': <function LuffyStudent.learning at 0x02441738>, 
    '__dict__': <attribute '__dict__' of 'LuffyStudent' objects>, 
    '__weakref__': <attribute '__weakref__' of 'LuffyStudent' objects>, 
    '__doc__': None,
     'eating': <function LuffyStudent.eating at 0x02441810>, 
    'school': 'Luffycity', 'sleep': <function LuffyStudent.sleep at 0x024417C8>, '__module__': '__main__'} Luffycity <function LuffyStudent.eating at 0x02441810>

    (2)查看类的属性

    # 查  类的属性
    print(LuffyStudent.school)  # LuffyStudent.__dict__['school']
    print(LuffyStudent.eating)  # LuffyStudent.__dict__['eating']
    
    # 运行结果
    Luffycity
    <function LuffyStudent.eating at 0x01F71738>

    (3)增加类的属性

    # 增加
    LuffyStudent.addr = 'xian'
    print(LuffyStudent.__dict__)
    print(LuffyStudent.addr)
    
    # 运行结果
    {'eating': <function LuffyStudent.eating at 0x005A17C8>, 
    'addr': 'xian',
     '__dict__': <attribute '__dict__' of 'LuffyStudent' objects>,
     'learning': <function LuffyStudent.learning at 0x005A1738>, 
    '__weakref__': <attribute '__weakref__' of 'LuffyStudent' objects>,
     'sleep': <function LuffyStudent.sleep at 0x005A1810>, 
    '__doc__': None, 
    '__module__': '__main__', 
    'school': 'Luffycity'}
    
    
    xian

    (4)删除类的属性

    # 删除
    del LuffyStudent.addr
    print(LuffyStudent.__dict__)
    
    #>>>
    {'eating': <function LuffyStudent.eating at 0x005A17C8>,
     '__dict__': <attribute '__dict__' of 'LuffyStudent' objects>,
     'learning': <function LuffyStudent.learning at 0x005A1738>, 
    '__weakref__': <attribute '__weakref__' of 'LuffyStudent' objects>, 
    'sleep': <function LuffyStudent.sleep at 0x005A1810>,
     '__doc__': None, '__module__': '__main__',
     'school': 'Luffycity'}

     (5)修改类的属性

    # 修改
    LuffyStudent.school = 'OldBoy'
    print(LuffyStudent.school)
    
    #>>>
    OldBoy

    5.如何使用对象?

    # 1.先定义类
    class LuffyStudent:
        school = 'Luffycity'
    
        def __init__(self, name, gender, age):
            self.name = name
            self.gender = gender
            self.age = age
    
        def eating(self):
            print('is eating')
    
        def learning(self):
            print('is learning')
    
    # 2.后产生对象
    stu1 = LuffyStudent('张三', '', 18)

      (1)__init__分析

      

      

      (2)查看stu1对象的命名空间、属性

    # 查对象stu1的命名空间
    print(stu1.__dict__)
    
    # >>>
    {'name': '张三', 'age': 18, 'gender': ''}
    # 查对象stu1的属性
    print(stu1.name)
    print(stu1.gender)
    print(stu1.age)
    
    # >>>
    张三
    女
    18
    #
    stu1.name = 'zhangsan'
    print(stu1.__dict__)
    
    # >>>
    {'name': 'zhangsan', 'gender': '', 'age': 18}
    #
    stu1.addr = 'xian'
    print(stu1.__dict__)
    
    # 》》》
    {'name': 'zhangsan', 'gender': '', 'addr': 'xian', 'age': 18}
    # 删除
    del stu1.age
    print(stu1.__dict__)
    
    # >>>
    {'gender': '', 'name': 'zhangsan'}

      

      (3)对象stu2

    stu2 = LuffyStudent('李四', '', 28)  # LuffyStudent.__init__(stu2,'李四', '男', 28)
    print(stu2.__dict__)
    print(stu2.name)
    print(stu2.gender)
    print(stu2.age)
    # 运行结果
    {'age': 28, 'gender': '', 'name': '李四'}
    李四
    男
    28

    6、属性查找

    # 先产生类
    class LuffyStudent:
        school = 'Luffy'
    
        def __init__(self, name, gender, age):
            self.name = name
            self.gender = gender
            self.age = age
    
        def learning(self):
            print('is learning')
    
        def eating(self):
            print('is eating')
    
        def sleeping(self):
            print('is sleeping')
    
    # 后产生对象
    stu1 = LuffyStudent('张三', '', 18)
    stu2 = LuffyStudent('李四', '', 28)
    stu3 = LuffyStudent('王五', '', 38)
    print(stu1.__dict__)
    print(stu2.__dict__)
    print(stu3.__dict__)
    
    # >>>
    {'name': '张三', 'gender': '', 'age': 18}
    {'name': '李四', 'gender': '', 'age': 28}
    {'name': '王五', 'gender': '', 'age': 38}

      

      (1)类的特征属性

    # 类中的数据属性:是所有对象共有的
    print(LuffyStudent.school, id(LuffyStudent.school))
    
    print(stu1.school, id(stu1.school))
    print(stu2.school, id(stu2.school))
    print(stu3.school, id(stu3.school))
    
    #>>>
    Luffy 43075776
    Luffy 43075776
    Luffy 43075776
    Luffy 43075776

      (2)类的技能函数

    # 类中的技能函数:是绑定给对象,绑定到不同的对象是不同的绑定方法
    print(LuffyStudent.learning)
    print(stu1.learning)
    print(stu2.learning)
    print(stu3.learning)
    
    #>>>
    <function LuffyStudent.learning at 0x02951780>
    <bound method LuffyStudent.learning of <__main__.LuffyStudent object at 0x0294FA90>>
    <bound method LuffyStudent.learning of <__main__.LuffyStudent object at 0x0294FAF0>>
    <bound method LuffyStudent.learning of <__main__.LuffyStudent object at 0x029621F0>>

      (3)调用类的技能函数

     

        def learning(self):
            print('%s is learning'%self.name)
    
    •   类调用
    LuffyStudent.learning(stu1)
    LuffyStudent.learning(stu2)
    LuffyStudent.learning(stu3)
    
    # 》》》
    张三 is learning
    李四 is learning
    王五 is learning
    •  对象调用
    stu1.learning()  # LuffyStudent.learning(stu1)
    stu2.learning()
    stu3.learning()
    
    #》》》
    张三 is learning
    李四 is learning
    王五 is learning

      (4)多个类的属性调用

        def learning(self, style):
            print('%s is learning %s'%(self.name,style))
    
    •   类调用
    LuffyStudent.learning(stu1,'english')
    LuffyStudent.learning(stu2,'chines')
    LuffyStudent.learning(stu3,'math')
    
    #>>>
    张三 is learning english
    李四 is learning chines
    王五 is learning math
    • 对象调用
    stu1.learning('english')  # LuffyStudent.learning(stu1)
    stu2.learning('chinese')
    stu3.learning('math')
    
    #>>>
    张三 is learning english
    李四 is learning chinese
    王五 is learning math

      (5)全局变量,局部调用

    • 局部变量调用
    # 定义一个属性  style = ’from luffy class‘
    LuffyStudent.style = 'from luffy class'
    
    print(stu1.__dict__)
    print(stu1.style)   # 调用
    • 只会到继承的父类查找,不会查找全局变量global

    7、一切皆对象

     

      (1)list和LuffyStudent都是类的不同表现形式

    #普通方法# 
    l1 = [1,2,3]
    l1.append(4)
    print(l1)
    
    
    # 通过类,对象,调用类的方法进行操作
    l1 = list([1,2,3])
    list.append(l1,4)
    print(l1)

    8、代码级别看面向对象

    (1)在没有学习类这个概念时,数据与功能是分离的

    def exc1(host,port,db,charset):
        conn=connect(host,port,db,charset)
        conn.execute(sql)
        return xxx
    
    
    def exc2(host,port,db,charset,proc_name)
        conn=connect(host,port,db,charset)
        conn.call_proc(sql)
        return xxx
    
    #每次调用都需要重复传入一堆参数
    exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
    exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')
    


    (2)我们能想到的解决方法是,把这些变量都定义成全局变量

    HOST=‘127.0.0.1’
    PORT=3306
    DB=‘db1’
    CHARSET=‘utf8’
    
    def exc1(host,port,db,charset):
        conn=connect(host,port,db,charset)
        conn.execute(sql)
        return xxx
    
    
    def exc2(host,port,db,charset,proc_name)
        conn=connect(host,port,db,charset)
        conn.call_proc(sql)
        return xxx
    
    exc1(HOST,PORT,DB,CHARSET,'select * from tb1;')
    exc2(HOST,PORT,DB,CHARSET,'存储过程的名字')

     

     (4)总结

      

    (5)可拓展性高

    •   定义类并产生三个对象
    class Chinese:
        country = 'China'
    
        def __init__(self, name, gender, age):
            self.name = name
            self.gender = gender
            self.age = age
    
    p1 = Chinese('alex', '', 22)
    p2 = Chinese('jack', '', 32)
    p3 = Chinese('tom', '', 42)
    
    print(p1.country)
    print(p2.country)
    print(p3.country)

      

    • 如果我们新增一个类属性,将会立刻反映给所有对象,而对象却无需修改

      

    9、小节练习

    练习1:编写一个学生类,产生一堆学生对象, (5分钟)
    
    要求:
    
    有一个计数器(属性),统计总共实例了多少个对象
    练习2:模仿王者荣耀定义两个英雄类, (10分钟)
    
    要求:
    
    英雄需要有昵称、攻击力、生命值等属性;
    实例化出两个英雄对象;
    英雄之间可以互殴,被殴打的一方掉血,血量小于0则判定为死亡。

      (1)我的代码

    class Student:
    
        count = 0
        def __init__(self):
            count += 1
    
    stu1 = Student()
    stu2 = Student()
    stu3 = Student()
    stu4 = Student()
    
    print(Student.count)

       

    # 练习2
    class Hero:
        def __init__(self, name, attack, hp):
            self.name = name
            self.attack = attack
            self.hp = hp
    
        def attacked(self, anyone):
            self.hp -= anyone.attack
    
        def __del__(self):
            if self.hp <= 0 :
                print('%s is died'%self.name)
    
    hero1 = Hero('akl', 35, 100)
    hero2 = Hero('tom', 20, 200)
    print(hero1.__dict__)
    print(hero2.__dict__)
    
    hero1.attacked(hero2)
    print(hero1.__dict__)
    hero2.attacked(hero1)
    print(hero1.__dict__)

    (2)老师代码

    class Student:
        count = 0
        def __init__(self, name, age, gender):
            self.name = name
            self.age = age
            self.gender = gender
            Student.count += 1
    
        def learn(self):
            print('%s is learning'%self.name)
    
    
    print(Student.__dict__)
    stu1 = Student('张三', 18, '')
    stu2 = Student('李四', 28, '')
    stu3 = Student('王五', 38, '')
    print(Student.__dict__)
    print(Student.count)
    # 练习2
    class Akl:
        city = 'Demacia'
    
        def __init__(self, nickname, life_value, aggresivity):
            self.nickname = nickname
            self.life_value = life_value
            self.aggresivity = aggresivity
    
        def attack(self, enemy):
            enemy.life_value -= self.aggresivity
    
    
    class Riven:
        city = 'Noxus'
    
        def __init__(self, nickname, life_value, aggresivity):
            self.nickname = nickname
            self.life_value = life_value
            self.aggresivity = aggresivity
    
        def attack(self, enemy):
            enemy.life_value -= self.aggresivity
    
    akl = Akl('暗影之拳', 100, 30)
    riven = Riven('锐萌萌', 100, 30)
    
    print(riven.__dict__)
    akl.attack(riven)
    print(riven.life_value)
    print(riven.__dict__)
  • 相关阅读:
    Python入门篇-解析式、生成器
    使用Kerberos进行Hadoop认证
    Python标准库-datatime和time
    使用Cloudera Manager部署HUE
    使用Cloudera Manager部署oozie
    使用Cloudera Manager部署Spark服务
    HDFS重启集群导致数据损坏,使用fsck命令修复过程
    关系型数据的收集
    使用Cloudera Manager搭建Kudu环境
    分布式结构化存储系统-Kudu简介
  • 原文地址:https://www.cnblogs.com/venicid/p/8563452.html
Copyright © 2011-2022 走看看