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

    面向对象

    什么是类?
    具有相同属性和方法的一类事物(框架,模子)
    什么是对象?
    对象是类中 具体的例子(拥有具体的属性值和具体方法)
    对象就是类的实例化,类的实例
    什么是实例?
    实例完全和对象一样
    什么是实例化?
    是由类创建对象的过程
    什么是对象的属性?
    存储在实例化之后创建的空间中所有变量都是对象的属性
    每一次实例化的空间都是独立的,每一个对象都有自己的属性值
    什么是动态属性?
    定义在类中的函数,自带一个self,就是调用这个方法的本身
    对象名 = 类名(参数)
    类名加() 相当于 执行类中的__init__ 方法
    
     类中的属性
     class Person:    #
         COUNTRY = '牧师'       # 静态属性类属性 属于类的 所有属于这个类的对象都共同的属性
         def __init__(self,name,sex,hp,mp,ad):
             self.name = name   # 属性 属于对象的值 - 对象属性
             self.sex = sex
             self.hp = hp
             self.mp = mp
             self.ad = ad
     print(Person.COUNTRY)
    类名:
        实例化对象 对象 = 类名()
        查看类中的属性 类名.(静态/类) 属性名
    对象:
      可以操作对象的属性
      调用对象的方法

     抽象类和接口类:
     与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化
    为什么要有抽象类
    如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
    从实现角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法。这一点与接口有点类似,但其实是不同的
    在python中实现抽象类:
    import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            pass
    
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def write(self):
            '子类必须定义写功能'
            pass
    抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
    
    抽象类是一个介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 
    
    在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。
    抽象类的写法:
    借助abc模块实现的抽象:
    from abc import ABCMeta,abstractmethod
    class Payment(metaclass = ABCMeta):
        @abstractmethod
        def pay(self):pass  #表示这个pay 方法必须在子类中出现 不然就报错
        @abstractmethod
        def back(self):pass  #表示这个back 方法必须在子类中出现 不然就报错

    面向对象的三大特性:

    继承:

    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

    继承分为
    单继承:
    class A:pass
    class B(A):pass
    多继承:
    class A:pass
    class B:pass
    class C(A,B):pass
    在多继承这,有一个继承优先级的问题,python中所有的类都是新式类 所有的新式类的继承顺序都遵循C3算法,也叫广度优先算法 可以使用
    类名.__mor__() 这个方法来查看继承顺序


    在继承中,子类可以使用父类的方法,super((先传父类名,再传self,也可以都不传)).父类的方法名
    或者 在子类中的同名方法调用父类的同名方法 调用,同样也遵循 C3算法
    在python2.X 中,分为经典类 和 新式类 , python3.X中所有的类都是新式类
    经典类与新式类的区别:
    经典类:不主动继承object类
        继承顺序按照深度优先的算法
        没有super() 方法
       不能使用mor方法或mor属性
    新式类:所有主动继承object类都是新式类
        就可以使用mor() 方法
        但是super()方法的使用必须传参数,super(子类名,对象名).方法名

     封装: 

    广义上:把一类事物的相同的行为和属性归到一个类中
    狭义上:把一些特殊的方法和属性藏到类中,外部无法调用,只有内部可以调用
    隐藏静态属性或方法:
    在属性名前面加上双下划綫,即可隐藏属性或方法,隐藏的属性或方法只能在类的内部调用或使用,不能在外部直接使用或调用,
    如果 一个类继承了含有暗藏属性或方法的类,那么这个类不可以调用或使用 父类隐藏的属性或方法
    我们 把这种隐藏的属性或方法 称为 私有方法或私有属性
    隐藏属性的意义:
    只能在类的内部被调用,保证了类内部数据的安全,不会被别人随意修改
    私有静态属性 : 为了不随意被外部修改
    私有方法 : 不希望被外部随意调用
    私有的对象属性 :
    不希望某个值被随便修改
    不希望某个值被从类的外部看到

    概括:
    封装实际上就是,隐藏对象的属性和实现细节,仅对外提供公共的访问方式

    多态:

    在python中处处是多态,Python是一门自带多态的语言,多态是指 一类事物有多中形态,
    在python中是实现多态,几个类拥有同名的方法,可以写一个函数,来统一进行调用,交归一化,
    与java的区别,在java中是通过继承来实现的,要求传递的数据的数据类型,是为了代码不出错
    python中的鸭子类:
    如果两个类都需要做某一件事,那么应该起相同的名字,这个时候,对于做这件事来说,这两个类就变成鸭子类
    不同类的相同方法也应该用相同的名字
  • 相关阅读:
    所有程序员都是自学成才
    Xcode6模拟器路径
    Xcode7中模拟器的位置
    数据结构中的二级指针和引用
    02_线性表的链式表示和实现
    Spring 单例 httprequest 线程安全
    Springboot listener
    Spring单例 和 Scope注解
    红黑树
    线程池
  • 原文地址:https://www.cnblogs.com/changtao/p/9984433.html
Copyright © 2011-2022 走看看