python与c#面向对象思想之继承

一 基本概念

   这里拿C#代表静态语言特性,拿python代表动态语言特性,做一个对比分析。

   继承是OOP最重要特性之一,任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员。在 OOP 中,被继承(也称为派生)的类称为父类(也称为基类)。注意, C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类,这里注意C#是有单根继承性的,而python是多继承的。但是,这里说明一点,c#里面也有多继承,定义接口并继承接口,可以实现多继承,多继承最主要的是属性的混乱,所以c#的接口只能定义方法,所以就避免了这种情况,而python里是通过魔法属性mro来决定调用父类初始化方法的顺序,实际上就是一个线性顺序表。

      在继承一个基类时,成员的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。不过,派生类和外部的代码都可以访问公共成员。这就是说,只使用这两个可访问性,不能让一个成员可由基类和派生类访问,而不能由外部的代码访问。

       这里又有了区别,Python中是没有修饰符的,指的是public,private等,那么标志一个私有成员,必须在变量前加一个下划线,在python中是不允许子类访问父类的私有成员。而在c#中,提供了protected这种修饰符,这样的话,某些属性既可以被子类访问,那么对外的还同私有性质一样。

      在C#中所有的类继承自System.Object,Python中继承自object(新式类)。

二 抽象类与接口

  很多人学完python不知道怎么用抽象类,情有可原,python原生的语法里并没有抽象类这一说法,而是通过adc模块来实现的抽象类,c#/c++都是要用到架构设计层次上的,而抽象类,作为一个通用基类的共同抽象是很有用的。比如说现在需要一个通信程序,那么我们知道,面对底层的通信,有串口,有网络。但是唯一不变的是什么,都需要读和写,所以完全可以先写一个抽象的通信类,定义一组方法为读和写。这就可以了。c#的抽象类网上大把资源,那么Python怎么实现抽象类呢?代码如下:

import abc

class All_file(metaclass=abc.ABCMeta):
    all_type = 'file'
    @abc.abstractclassmethod
    def read(self):
        '子类必须重写读功能'
        pass

    @abc.abstractclassmethod
    def write(self):
        '子类必须重写写功能'
        pass

class Txt(All_file):

    def read(self):
        print('文本文件读')

    def write(self):
        print('文本文件写')

Text = Txt()

Text.read()

 python实现抽象类的方式是用abc模块来实现。实现方式就如上述代码

猜你喜欢

转载自blog.csdn.net/qq_33324878/article/details/81081506
今日推荐