• 万丈高楼平地起-面向对象基础知识大汇总


    1. 反射

    通过字符串形式,导入模块
    通过字符串的形式,去模块中寻找指定函数,并执行
    反射: 根据字符串的形式去对象(某个模块)中操作它的成员
    

    1.1 import 导入模块

    1.2 getattr 获取属性

    1.3 setattr 设置属性

    1.4 hasattr 检测是否有对应的属性

    1.5 delattr 删除属性

    2. 面向对象编程

    2.1 面向对象编程步骤

    • a. 定义类
        class 类名:
            def 方法1(self, bb):
                pass
        例如:
        class Person:
            def showName(self, name):
                return name
    
    • b. 根据类创建对象(创建一个类的实例)
        # 使用对象去执行类中的方法
        p1 = Person()
        p1.showName("小红")
    

    2.2 self

    • self 是内部自动传入的参数,当对象被创建出来的时候,系统会自动把这个对象
      传入到内部方法的self形参上
    
    class Person:
    
        def show_name(self, name):
            # <__main__.Person object at 0x107001400>
            print(self)
            return name
    
    obj1 = Person()
    print(obj1)  # <__main__.Person object at 0x107001400>
    obj1.show_name("xiaoqiang")
    obj2 = Person()
    print(obj2)
    obj2.show_name("xiaoli")
    

    2.3 __init__初始化

    • 当调用类去创建一个对象的时候,会自动执行类中的__init__方法
    • 可以在__init__ 方法中做一些初始化操作
    • __init__又叫做构造方法
    class Foo:
        # 构造方法
        def __init__(self, bk):
            self.name = "zoran"
            self.bk = bk
    
        def showbk(self):
            print(self.bk)
    # 创建对象的实例,把 xx 值 封装到对象里面
    obj1 = Foo("xx")
    obj1.showbk()
    obj2 = Foo("oo")
    obj2.showbk()
    

    2.4 del

    • 当解释器销毁对象的时候,会自动调用__del__方法
    • __del__又叫做析构方法
    class Foo:
        # 构造方法
        def __init__(self, bk):
            self.name = "zoran"
            self.bk = bk
    
        def showbk(self):
            print(self.bk)
    
        def __del__(self):
            print("对象销毁了")
    
    # 创建对象的实例,把 xx 值 封装到对象里面
    obj1 = Foo("xx")
    obj1.showbk()
    obj2 = Foo("oo")
    obj2.showbk()
    

    2.5 封装

    • 使用场景:当同一类型的方法具有相同参数时,直接封装到对象
    • 使用场景:把类当作模版,创建多个对象,对象内封装的数据可以不一样

    2.6 继承

    • 子类可以继承父类所有的功能
    # 父类  基类
    class Animals:
        def eat(self):
            print(self.name + "吃")
    
        def drink(self):
            print(self.name + "喝")
    
    
    # 子类  派生类
    class Cat(Animals):
        def __init__(self, name):
            self.name = name
    
        def shout(self):
            print(self.name + "汪")
    
    
    # 子类 派生类
    class Pig(Animals):
        def __init__(self, name):
            self.name = name
    
        def sleep(self):
            print(self.name + "在睡觉")
    
    
    p1 = Pig("蛋蛋")
    p1.sleep()
    p1.eat()
    p1.drink()
    c1 = Cat("痘痘")
    c1.eat()
    c1.drink()
    c1.shout()
    
    • 当父类和子类同时存在某功能时,优先使用子类功能
    • 可以继承多个类,当继承多个类当时候,父类优先级从左到右
    • 可以继承父类的构造方法
    # 1.在子类中的构造方法中调用supper方法
    super(Cat, self).__init__()
    # 2. 直接执行父类的构造方法
    Annimal.init__(self)
    # 推荐使用supper这种形式
    

    2.7 多态

    2.8 成员

    • 通过类去访问:静态字段、静态方法
    • 通过对象访问: 普通字段、类的方法
    • 用@staticmethod装饰器去修饰的方法就是静态方法 类名.静态方法()
    • 不管是静态方法还是静态字段都可以去用对象去访问,但是建议使用类去方法
    • 静态方法存在的意义:不需要创建对象就可以访问这个方法,就相当于直接写了一个函数,把这个函数放在类里面类
    • 类方法:类方法和静态方法差不多功能,只是比静态方法多加了参数
    • @property : 在调用的时候不需要加括号,把方法伪造成了字段 这个用来获取值
    • @函数名.setter 这个用来设置值
    • 可以通过__dict__方法查看成员 Foo.__dict

    2.9 成员修饰符

    • 有些成员是公开的、有些成员是私有的
    • 默认情况成员是公有的
    • 带下划线表示私有的 ( __字段名, __方法名),私有的成员只有自己才能访问,子类都是不可以访问的
    • 可以通过公有方法来调用内部私有方法

    2.10 面向对象中一些常用方法

    1. __init__
    2. __call__  Foo()() 会执行call方法
    3. __getitem__ obj = Foo()  obj["k1"] 会去执行getitem方法
    4. __setitem__ obj = Foo() obj["k1"] = 123 会执行setitem方法
    5. __delitem__ del obj["k1"] 会执行delitem方法
    6. __dict__ 查看成员  Foo.__dict
    7. __iter__ 当for循环迭代的时候 会自动执行这个方法
    8. __str__ 当print一个对象或者通过str把对象转换成字符串的时候会触发__str__方法
    
    
    class Foo:
        def __init__(self):
            print("初始化完成")
    
        def __call__(self, *args, **kwargs):
            print("call方法执行了")
    
        def __getitem__(self, item):
            print("getitem方法执行了", item)
    
        def __setitem__(self, key, value):
            print("setitem方法执行了", key, value)
    
        def __delitem__(self, key):
            print("delitem执行了", key)
    
        def __iter__(self):
            yield 1
            yield 2
            yield 3
            yield 4
            yield 5
    
    
    
    # 当类开始创建的时候 init方法会执行
    obj = Foo()
    
    # Foo()() call 方法执行
    Foo()()
    # 这种形式调用  Foo类里面的__getitem__会被执行
    obj["k1"]
    # 设置值的时候  Foo类里面的__setitem__会被执行
    obj["k2"] = "k2==>2"
    # 删除某个值的时候 Foo类里面__delitem__会被执行
    del obj["k2"]
    # for循环迭代的时候 会自动执行 __iter__方法
    for i in obj:
        print(i)
    

    2.11 异常处理

    try:
        num = int(ipt)
        print(num)
    except Exception as e:
        print(e)
    # Exception 宽泛的错误类型,可以捕捉到任何错误
    except Exception:
        print("数据类型转换失败")
    
    • 常见异常类型
      • AttributeError 视图访问一个对象没有的属性,例如:foo.age 但是foo没有age属性
      • IOError 输入/输出异常,基本上是路径问题或名称错误
      • ImportError 无法引入模块或包,基本上是路径问题或名称错误
      • IndentationError 语法错误
      • IndexError 索引超出边界
      • KeyError 访问的键不存在
      • ValueError 传入的值类型不正确
    • 主动触发异常
    ipt = input("请输入内容:")
    try:
        num = int(ipt)
        raise Exception("出错了")
    except Exception as e:
        print("数据类型转换失败")
    

    2.12 断言

    • 通常用来做测试
    assert 1 == 2
    
  • 相关阅读:
    docker学习及应用
    openstack入门及应用
    C# 值类型,引用类型区别
    C# 继承
    Unity 使用Plugins接入安卓SDK 基础篇
    详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例
    Unity3D 协程 浅谈
    《俄罗斯,有点意思》
    老男孩之《生日快乐》
    【诗歌系列】《神曲》
  • 原文地址:https://www.cnblogs.com/dadifeihong/p/7445503.html
Copyright © 2020-2023  润新知