python面向对象

Posted 成功的路上并不拥挤,因为坚持的人很少!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中的鸭子类:
如果两个类都需要做某一件事,那么应该起相同的名字,这个时候,对于做这件事来说,这两个类就变成鸭子类
不同类的相同方法也应该用相同的名字

 

以上是关于python面向对象的主要内容,如果未能解决你的问题,请参考以下文章

面向面试编程代码片段之GC

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装

python之路之前没搞明白4面向对象(封装)

jquery e.target.hasClass 不工作

Scala的面向对象与函数编程