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