尝试读fast.ai的源码,遇到了困惑
class DataBunch():
"Bind `train_dl`,`valid_dl` and `test_dl` in a data object."
def __init__(self, train_dl:DataLoader, valid_dl:DataLoader, fix_dl:DataLoader=None, test_dl:Optional[DataLoader]=None,
device:torch.device=None, dl_tfms:Optional[Collection[Callable]]=None, path:PathOrStr='.',
collate_fn:Callable=data_collate, no_check:bool=False):
这里的init是一个初始化函数,定义完init()后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。
类中的函数称为方法,init()是一个特殊的方法,每当你根据类创建新实例时,python都会自动运行它,在这个方法的名称中,开关和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。init()中的形参self必不可少,还必须位于其他形参的前面 ,Python调用这个init()方法来创建实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
这个之前也用过,但是概念比较模糊,这里要明确一个点:self指向的是类的实例,而不是类本身,如果想要在类里写一个函数(或者说方法),这个方法只和类本身交互,而不和类的实例交互,就可以使用@classmethod,比如向下面的例子:
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
@classmethod
def get_no_of_instance(cls_obj):
return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()
fast.ai里面的ImageDataBunch类里面就有很多的@classmethod,所以它可以这么调用:
data = ImageDataBunch.from_name_re(path_img, fnames, pat, ds_tfms=get_transforms(), size=224, bs=bs
).normalize(imagenet_stats)
看到没有,没实例化ImageDataBunch类哦
网友评论