打赏

Python基础(25)——类的静态、组合、继承

静态属性、静态方法、类方法

静态属性

其实就是所有的属性都变成数据属性      @property加装饰器   就是把函数属性编程了数据属性不用加()就能调用结果,看起来像是数据属性一样使用,需要把函数里加入返回值。

在使用的时候在外面看起来 数据属性和方法属性是一样的,没有区别。这种做法封装后可以隐藏背后的逻辑,看起来简单并且保持类操作的一致性

@property的时候 函数方法必须有返回值

类方法

类方法@classmethod    就是用类调用方法,不需要传入self的参数了,类方法的参数是cls,这样就不需要实例跟实例没什么关系,只是类级别的操作,这时候用类方法就可以实现对类属性的操作了和实例无关。不要用实例去操作

静态方法

@staticmethod

静态方法是类的工具包,只是名义上归属于类管理在类的字典里,不跟类绑定,也不跟实例绑定,参数中没有self 也没有cls,类和实例都能共用,普通的函数实例调用会传参数会报错,所以要加这个功能。不能使用类变量和实例变量

与类方法的区别,类方法是cls专门给类使用的

组合

多个小类组合在一个大类中,小类实例化后赋值给大类中初始化。

比如一个学校类包含很多其他类,学生老师课程等。把小类当成个对象传给大类中的一个初始化参数,实现类的组合。 其实就是调用大类中的小类的一个对象,类跟类之间有关联的也可以用组合实现

应该就是类之间的复用。

 继承

父类又称为基类

一个类继承另一个类,内部dict是不会有变化的,但实例化的时候,实例对象是有父类的全部属性的

子类属性和父类属性重名,只不过是优先调用并不是覆盖掉父类的属性的意思

继承同时有两个作用:继承结构与派生新东西               优点:代码可以重用但是这种继承子类和父类有耦合,有重合。    第二种是定义接口类,子类继承父类的接口,以后写成的都是接口开发,需要理解接口这个用法,父类定义的接口子类必须重写接口

接口模块

import abc

class stu(metaclass=abc.ABCMeta):

    @abc.abstractmethod   #定义成接口函数,继承的子类必须重新写这个接口,否则不能实例化
    def read(cls):
        pass

class stu1(stu):
    def write(self):
        pass

上面代码在实例化的时候就会报错,因为abc限定了子类必须重新定义read的接口,必须重新写这个接口

这样大家都实现了归一化,实现最终的统一的设计思想。就像linux一切皆文件的概念,所有东西都能当文件来处理,就两个方法,一个读一个写,调用基本的方法就可以了,因为他必须实现基类的接口

接口类里的接口函数不需要实现,接口类不需要实例化,因为他就是为了写个规范,范式。

继承顺序

 

 Python3中都是新式类,所有的类都继承于一个系统的object类,所以就是新式类,其他都是经典类,继承顺序是存在于一个叫 MRO的列表中 __mro__,遵循三个原则:1、子类优先 2、多个父类会根据MRO列表顺序找 3、找到第一个就停止了。

Python3中的顺序是广度优先,先子类一层一层往上层级推进

Python2中是经典类,会是深度优先,一条线一直找到底。

 子类调用父类的方法,在子类中复用父类的方法就是传个self进父类的方法就可以了,但这样不易维护,所以引出了super方法,这样就省略了父类的名字,基于上一层的父类

super().__init__(name,speed)   这里没有父类的名称,也不用传self  ,这样的好处:不用写父类名字,如果父类的名字改变,继承的子类不受影响;另外不用传self参数了

 

posted on 2019-07-14 21:10  大有哥  阅读(178)  评论(0)    收藏  举报

导航