26, herencia de clases de Python y sobrecarga de funciones

# 类继承

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)

Salida del programa:

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

Podemos ver Create Mp4Video, pero no llamó al método de construcción de nuestra clase principal. Esto no es consistente con nuestro C ++. En C ++, cuando se genera un objeto de subclase, el método de construcción de la clase principal se llama automáticamente.
Sin embargo, en Python, no se llama al constructor de la clase principal. En Python, solo se llama al constructor de la subclase y no se llama activamente al constructor de la clase principal.

# 类继承

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())

Salida del programa:

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

Podemos ver que, a diferencia de C ++, Python solo llama al destructor de la subclase, no al destructor de la clase padre.
Herencia significa que tenemos todos los parámetros y métodos de la clase padre.

A veces usaremos algún polimorfismo en la herencia. En este momento, necesitamos juzgar qué tipo de objeto es y qué clase es, ¿cómo lo juzgas?
Python proporciona un método: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))

Salida del programa:

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

A través de este método, cuando tienes múltiples clases heredadas, puedes elegir según su tipo, y puedes juzgar por esto, lo que nos hace más conveniente diseñar patrones.

Supongo que te gusta

Origin blog.csdn.net/zhaopeng01zp/article/details/109291074
Recomendado
Clasificación