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

    1. 面向对象基础

    • 类与对象
    先有类再有对象
    
    python内置的相关属性:
    类名.__name__# 类的名字(字符串)
    类名.__doc__# 类的文档字符串
    类名.__base__# 类的第一个父类
    类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
    类名.__dict__# 类的字典属性
    类名.__module__# 类定义所在的模块
    类名.__class__# 实例对应的类(仅新式类中)
    
    • 属性查找
    类中数据属性是所有对象共享
    函数属性默认绑定给对象用的
    先从对象自己的名称空间找,没有再去类中找,没有就报错
    
    • 绑定方法
    对象调用:
    类中函数没任何修饰以及数据属性默认是绑定给对象使用的,对象内自己的数据属性是独有的
    
    类调用:
    在函数上被 @classmethod修饰,即绑定类,将类作为参数传入
    
    调用规则:
    绑定给谁就由谁来调用,谁来调用就会将自己作为第一个参数传入
    
    • 非绑定方法
    类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法
    既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用
    但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数
    

    2.继承、派生及多态

    2.1 继承

    • 定义
    创建新类的方式,继承一个或者多个父类,
    继承了父类的功能
    
    • 经典类与新式类
    经典类:没有继承object以及该类的子类都是经典类
    新式类:继承object以及该类的子类
    
    • 抽象与继承
    将相同的属性抽取成父类,再继承
    

    2.2 派生

    • 定义
    子类自己添加新的属性,如果与父类属性重名那么以自己的为准
    
    • 组合与重用性
    组合:在一个类中把另一个类的对象作为数据属性
    应用:两个类之间显著不同,其中一个类是另外一个类所需的组件,可以使用组合
    
    • 接口与归一化
    接口:函数的集合
    归一化:基于同一个接口实现的类,那么这些类产生的对象在使用时,从用法上来说都一样
    
    • 抽象类
      只能继承不能被实例化

    2.3 继承原理(菱形继承)

    • 查找
    类是经典类时,多继承情况下,按照深度优先的原则,
    新式类的话,广度优先的原则
    
    print(cls.__mro__) # 查看新式类的继承顺序
    
    • 子类调用父类的方法
    1、指名道姓调用
    父类名.__init__(属性名。。。)
    
    2、super().__init__(属性名..)
    注:super()相当于super(子类名,self)
    

    2.4 多态与多态性

    多态:
    一类事物的多种状态
    多态性:
    每个对象用自己的方式响应共同的对象,(铃声,老师下班,学生放学)
    
    优势:同一种方式去调用
    可扩展性,灵活性
    

    2.5 封装

    • 隐藏
    双下划线开头的方式将属性隐藏起来,只发生于类定义阶段
    本质是是一个变形操作,(__属性名)成了(_类名__属性名)
    访问:
    类内部可以通过(__属性名)访问,类外部要通过(_类名__属性名)才能访问
    
    • 封装意义
    1、封装数据:隐藏数据后,提供操作该数据的接口,在接口上附件对该数据的使用限制
    2、隔离复杂度,使用简单的接口
    

    2.6 特性(property)

    将@装饰在函数上,调用该函数通过函数名就可以得到返回值
    class Circle:
        def __init__(self,radius): #圆的半径radius
            self.radius=radius
        @property
        def area(self):
            return math.pi * self.radius**2 #计算面积
        @property
        def perimeter(self):
            return 2*math.pi*self.radius #计算周长
    c=Circle(10)
    print(c.radius)
    print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
    print(c.perimeter)
    
    • 封装与扩展性
    类实现者可以修改封装内的东西而不影响外部调用者的代码
    
  • 相关阅读:
    二次识别
    IPC
    HW
    数据库异常:SQL Error: 0, SQLState: S0022
    mysql 分页查询
    [Err] 1248
    名句摘抄
    理智向左 疯狂向右
    kindle怎么导入电子书
    设置 myeclipse 编码格式
  • 原文地址:https://www.cnblogs.com/quqinchao/p/11257681.html
Copyright © 2011-2022 走看看