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
今日推荐