26、Pythonクラスの継承と関数のオーバーロード

# 类继承

class Video(object):
    # 4、私有成员变量 两个下划线开头定义的变量就是私有成员变量
    __name = "private name"
    # 3、直接声明成员变量
    # 声明的意思是这个变量的空间不产生,只有当Video生成对象的时候这个空间才产生,所以叫声明
    age = 20
    path = ""
    # 构造函数
    def __init__(self, path):
        print("Create Video")
        self.name = "public name"
        self.path = path
        print("path is", self.path)
    
    # Python约定了我们函数名全部是小写
    def get_name(self):
        return self.__name
    
    # 析构函数
    def __del__(self):
        print("Delete Video") 

# 类继承
class Mp4Video(Video):
    def __init__(self):
        print("Create Mp4Video")

mp4 = Mp4Video()
print(mp4)

プログラム出力:

Create Mp4Video
Delete Video
<__main__.Mp4Video object at 0x000001E5ADF30390>

Create Mp4Videoを見ることができますが、親クラスの構築メソッドを呼び出していません。これはC ++と一致していません。C++では、サブクラスオブジェクトが生成されると、親クラスの構築メソッドが自動的に呼び出されます。
ただし、Pythonでは、親クラスのコンストラクターは呼び出されません。Pythonでは、子クラスのコンストラクターのみが呼び出され、親クラスのコンストラクターはアクティブに呼び出されません。

# 类继承

class Video(object):
    # 4、私有成员变量 两个下划线开头定义的变量就是私有成员变量
    __name = "private name"
    # 3、直接声明成员变量
    # 声明的意思是这个变量的空间不产生,只有当Video生成对象的时候这个空间才产生,所以叫声明
    age = 20
    path = ""
    # 构造函数
    def __init__(self, path):
        print("Create Video")
        self.name = "public name"
        self.path = path
        print("path is", self.path)
    
    # Python约定了我们函数名全部是小写
    def get_name(self):
        return self.__name
    
    # 析构函数
    def __del__(self):
        print("Delete Video") 

# 类继承
class Mp4Video(Video):
    def __init__(self, path): # 不会主动调用父类构造函数,需要显式调用父类构造函数
        Video.__init__(self, path)
        print("Create Mp4Video")
    def __del__(self):
        print("Delete Mp4Video")

mp4 = Mp4Video("e:/test.mp4")
print("mp4.get_name()", mp4.get_name())

プログラム出力:

Create Video
path is e:/test.mp4
Create Mp4Video
Delete Mp4Video
mp4.get_name() private name

C ++とは異なり、Pythonはサブクラスのデストラクタのみを呼び出し、親クラスのデストラクタは呼び出さないことがわかります。
継承とは、親クラスのすべてのパラメーターとメソッドがあることを意味します。

継承に多態性を利用することもありますが、現時点では、オブジェクトの種類とクラスを判断する必要がありますが、どのように判断しますか?
Pythonはメソッドを提供します:isinstance()

# 类继承

class Video(object):
    # 4、私有成员变量 两个下划线开头定义的变量就是私有成员变量
    __name = "private name"
    # 3、直接声明成员变量
    # 声明的意思是这个变量的空间不产生,只有当Video生成对象的时候这个空间才产生,所以叫声明
    age = 20
    path = ""
    # 构造函数
    def __init__(self, path):
        print("Create Video")
        self.name = "public name"
        self.path = path
        print("path is", self.path)
    
    # Python约定了我们函数名全部是小写
    def get_name(self):
        return self.__name
    
    # 析构函数
    def __del__(self):
        print("Delete Video") 

# 类继承
class Mp4Video(Video):
    def __init__(self, path): # 不会主动调用父类构造函数,需要显式调用父类构造函数
        Video.__init__(self, path)
        print("Create Mp4Video")
    def __del__(self):
        print("Delete Mp4Video")

mp4 = Mp4Video("e:/test.mp4")

class AviVideo(Video):
    pass

print(isinstance(mp4, Mp4Video))
print(isinstance(mp4, Video))
print(isinstance(mp4, AviVideo))

プログラム出力:

Create Video
path is e:/test.mp4
Create Mp4Video
Delete Mp4Video
True
True
False

この方法により、継承するクラスが複数ある場合は、その種類に応じて選択することができ、これで判断できるため、パターンの設計が容易になります。

おすすめ

転載: blog.csdn.net/zhaopeng01zp/article/details/109291074