美文网首页
类Class __init__ 和 @classmethod

类Class __init__ 和 @classmethod

作者: Yuyao_b2c0 | 来源:发表于2020-03-01 13:43 被阅读0次

    尝试读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类哦

    相关文章

      网友评论

          本文标题:类Class __init__ 和 @classmethod

          本文链接:https://www.haomeiwen.com/subject/pglqkhtx.html