继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。
特点:子类可以使用父类的方法,就是函数
举个简单的例子
class grandFather():
print('我是爷爷')
class Parent(grandFather):
print('我是父类')
class SubClass(Parent):
print('我是子类')
sub = SubClass()
#结果: 我是爷爷
# 我是父类
# 我是子类
#注意:类在定义的时候就执行类体代码,执行顺序是从上到下
深入一下super().init()含义
- 没有super(A, self).init()时调用A的父类Root的属性和方法(方法里不对Root数据进行二次操作)
class Root(object):
def __init__(self):
self.x= '这是属性'
def fun(self):
#print(self.x)
print('这是方法')
class A(Root):
def __init__(self):
print('实例化时执行')
test = A() #实例化类
test.fun() #调用方法
test.x #调用属性
下面是结果:
Traceback (most recent call last):
实例化时执行
这是方法
File "/hom/PycharmProjects/untitled/super.py", line 17, in <module>
test.x # 调用属性
AttributeError: 'A' object has no attribute 'x'
- 加入super(A, self).init()时调用A的父类Root的属性和方法(方法里对Root数据进行二次操作)
class Root(object):
def __init__(self):
self.x = '这是属性'
def fun(self):
print(self.x)
print('这是方法')
class A(Root):
def __init__(self):
super(A,self).__init__()
print('实例化时执行')
test = A() # 实例化类
test.fun() # 调用方法
test.x # 调用属性
结果如下
实例化时执行
这是属性
这是方法
siamfc++
在videoanalyst/data/sampler/sampler_impl/track_pair_sampler.py中出现
class TrackPairSampler(SamplerBase):
def __init__(self,
datasets: List[DatasetBase] = [],
seed: int = 0,
data_filter=None) -> None:
super().__init__(datasets, seed=seed)
理解这个super().__init__
需要回到SamplerBase类中的__init__()
在videoanalyst/data/sampler/sampler_base.py
class SamplerBase:
def __init__(self, datasets: List[DatasetBase] = [], seed: int = 0) -> None:
self._hyper_params = self.default_hyper_params
self._state = dict()
self._state["rng"] = np.random.RandomState(seed)
self.datasets = datasets
for d in datasets:
dataset_name = type(d).__name__
logger.info("Sampler's underlying datasets: {}, length {}".format(
dataset_name, len(d)))
可以看到super().__init__(datasets, seed=seed)
中的dataset是传递到SamplerBase
类中做初始化,这样就可以继承SamplerBase
类中属性。