面向对象小结

1.面向对象的几个经典问题:

1)什么时候用到面向对象:处理复杂的角色之间关系时;比如开发一个大的系统,功能比较复杂;

  优点:隔离对象之间的调用;提高代码的安全性;代码的清晰度高模块化;可读性,具有可扩展性;增加了代码的复用性;

2)Python中的一切皆对象:Python中的基础数据类型都是对象;

3)类型和类的关系:自定的类都是Python的一种新的数据类型,所以类和数据类型是指一个东西;

 说一个对象是什么数据类型就是指它属于哪一个类;

4)创建一个类:类也是被创建出来的,type创建了类;

 

from abc import ABCMeta,abstractmethod  #导入创建抽象类的模块
class A(metaclass=ABCMeta):        #这是抽象类,(metaclass=ABCMeta)相当于ABCMeta创建了抽象类的空间
    @abstractmethod
    def func(self):
        pass
print(type(A))                #<class 'abc.ABCMeta'>

class B(metaclass=type):    #如果是一个普通类,就相当于type创建了一个类
    def func(self):
        pass
print(type(B))                #<class 'type'>

 

创建一个类的对象就称为元类(这里ABCMeta,type都是元类)

有ABCMeta创建的元类不能被实例化;

**** 创建类和函数的区别,函数体内只有在调用时才会加载,而类在创建时就会执行里面的代码块;

**** 创建类时会从头读到尾,然后把这个空间赋值给类名:供类名的引用

5)对象:可以通过指针找到类的空间的内容  对象本身内部也存储了一些只属于对象的属性(但是对象没有自己独特的方法)

2.组合:

a:一个类的对象作为另一个对象的属性

b:组合表示两个对象之间什么有什么的关系

3.继承:表示两个类之间什么是什么的关系

a:继承分为单继承和多继承

  单继承:如果子类的对象调用某个方法

      1)子类有:调用子类的

        子类有但想调用父类的:

          a:super:不用自己传self, 格式:super(子类,self).方法名(除了self之外的参数)

          b:父类名:格式:父类名.方法名(self,...)

          注意:在任何类中调用的方法,都要仔细分辨一下self到底是谁的对象

      2)子类没有:就找父类的 

   多继承
   新式类 : 广度优先 - C3算法
   mro方法查看继承顺序
  py3 默认继承object 所以py3都是新式类
   super().func() 遵循mro算法,在类的内部不用传子类名和self
   py2 需要主动继承object
   super(子类名,self).func() 必须传子类名和self
   经典类 : 深度优先
   py2 不继承object,默认都是经典类
   没有mro

b:作用:提高代码的冗余;提高代码的复用性

抽象类和接口类

    # 不能被实例化,
# 规范子类当中必须实现某个方法
# 有原生(Python解释器自带的语法)的实现抽象类的方法,但是没有原生实现接口类的方法
  # Python解释器不支持的语法,需要你导入的模块不是原生的;


# 抽象类 : 抽象类中的方法是可以实现的 只能单继承,不能被子类多继承了
# 接口类 : 可以多继承 但是这个类中的所有方法都不应该实现
# java
# java 只支持类的单继承 抽象类 父类的方法可以实现
# 接口 interface 支持多继承的规范 接口中的所有方法 只能写pass
3.多态
a:一种类型的多种形态,
多个子类去继承父类,那么每一个子类都是这个父类的一种形态
b:
# 鸭子类型 规范全凭自觉

 

4.封装

 

# 广义的封装 : 把方法和属性都封装在一个类里,定义一个规范来描述一类事物.
# 狭义的封装 : 私有化 只能在类的内部访问
# 私有的静态变量,私有方法,私有的对象属性,私有的类方法,私有的静态方法
# 在内存中存储 _类名__名字
# 为什么在类的内部可以使用双下划线访问 : 在类的内部使用,你就知道你在哪个类中
# 在子类中可以访问访问父类的私有变量么?不行
# 私有 : 不能在类的外部使用也不能被继承
5.property
装饰器函数,内置函数,帮助你将类中的方法伪装成属性,特性
# 调用方法的时候不需要主动加括号
# 让程序的逻辑性更合理
# @方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数,被修改的值
# @方法名.deleter 装饰器,当要删除被property装饰的属性的时候会调用被这个装饰器装饰的方法
6.classmethod
classmethod 类方法的装饰器 内置函数
# 使用类名调用,默认传类名作为第一个参数
# 不用对象命名空间中的内容,而用到了类命名空间中的变量(静态属性),或者类方法或静态方法
7.statimethod
# staticmethod 静态方法的装饰器 内置函数
# 如果一个类里面的方法 既不需要用到self中的资源,也不用cls中的资源.
# 相当于一个普通的函数
# 但是你由于某种原因,还要把这个方法放在类中,这个时候,就将这个方法变成一个静态方法
# 某种原因:
# 你完全想用面向对象编程 ,所有的函数都必须写到类里
# 某个功能确确实实是这个类的方法,但是确确实实没有用到和这个类有关系的资源
 

 

posted @ 2018-08-04 22:12  pythonZhou  阅读(175)  评论(0编辑  收藏  举报