赞
踩
类的__dict__返回的是:类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里的,
而实例化对象的:__dict__中存储了一些类中__init__的一些属性值。
import的py文件 __dict__返回的是:__init__的一些属性值 + 该py文件中的不在class中的方法(可以进行调用并得到返回值)
__dict__的返回值为字典,你可以通过
- class MyTestDict(object):
- a = 0
- b = 1
-
- def __init__(self):
- self.a = 2
- self.b = 3
-
- def test_func(name=None):
- print('I am {}'.format(name))
-
- @staticmethod
- def static_test():
- print('static_test')
-
- @classmethod
- def class_test(cls):
- print('class_test')
-
-
- myTestDict = MyTestDict()
- print(MyTestDict.__dict__)
- print(myTestDict.__dict__)
{'__module__': '__main__',
'a': 0,
'b': 1,
'__init__': <function MyTestDict.__init__ at 0x7f1057ed5700>,
'test_func': <function MyTestDict.test_func at 0x7f1057e00c10>,
'static_test': <staticmethod object at 0x7f1057f84cd0>,
'class_test': <classmethod object at 0x7f1057f21400>,
'__dict__': <attribute '__dict__' of 'MyTestDict' objects>,
'__weakref__': <attribute '__weakref__' of 'MyTestDict' objects>,
'__doc__': None}
{'a': 2, 'b': 3}
这里要注意:利用__dict__实例化的时候,一定要在最后加上(),否则实例化不了
print(MyTestDict.__dict__["test_func"](name='XiaoMing'))
I am XiaoMing
official.py文件内容:
- class MyTestDict(object):
- a = 0
- b = 1
-
- def __init__(self):
- self.a = 2
- self.b = 3
-
- def test_func(name=None):
- print('I am {}'.format(name))
-
- @staticmethod
- def static_test():
- print('static_test')
-
- @classmethod
- def class_test(cls):
- print('class_test')
-
-
-
- # 如果在class外部,则在import这个py文件的时候,可以通过official.__dict__['test_func_Out'](name='Tom')来调用
- def test_func_Out(name=None):
- print('I am {}'.format(name))
- return name
另外一个py文件:
这样可以调用另外py文件中的方法
- import official
-
- print(official.__dict__['test_func_Out'](name='Tom'))
-
I am Tom
Tom
其实一个很关键的原因是因为这样可以在import一些py文件的时候,可以通过自定义的args参数来指定使用哪个model(特别是当你有多个想要调用的model进行测试的时候),直接调整args的参数就可以了,很方便。否则的话你每次换一个模型进行测试,都需要重新写一次import XXX
例如在RCG中:
- # load model
- pretrained_encoder = models_pretrained_enc.__dict__[args.pretrained_enc_arch](proj_dim=args.rep_dim)
-
- # load pre-trained encoder parameters
- if 'moco' in args.pretrained_enc_arch:
- pretrained_encoder = models_pretrained_enc.load_pretrained_moco(pretrained_encoder, args.pretrained_enc_path)
- elif 'simclr' in args.pretrained_enc_arch:
- pretrained_encoder = models_pretrained_enc.load_pretrained_simclr(pretrained_encoder, args.pretrained_enc_path)
- else:
- raise NotImplementedError
在第一步的load model中,使用了__dict__[args.pretrained_enc_arch]来加载预训练的模型,然后再加载这个模型所对应的参数。
这样只需要修改args.pretrained_enc_arch]的参数就可以测试不同的预训练模型对模型带来的影响,否则话,你每次调用一个新的预训练模型,都需要重写语句。
- import models_pretrained_enc
- # 想要调用预训练模型1
- pretrained_encoder1 = models_pretrained_enc.ExampleModel1(proj_dim=args.rep_dim)
- # 想要调用预训练模型2
- pretrained_encoder2 = models_pretrained_enc.ExampleModel2(proj_dim=args.rep_dim)
- # 想要调用预训练模型3
- pretrained_encoder3 = models_pretrained_enc.ExampleModel3(proj_dim=args.rep_dim)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。