当前位置:   article > 正文

python中的__dict__

python中的__dict__

类的__dict__返回的是:类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类的__dict__里的,

而实例化对象的__dict__中存储了一些类中__init__的一些属性值。 

import的py文件 __dict__返回的是:__init__的一些属性值  +  该py文件中的不在class中的方法(可以进行调用并得到返回值)

一、在一个py文件内调用:

可以通过__dict__访问类中的所有属性的键值对

__dict__的返回值为字典,你可以通过

  1. class MyTestDict(object):
  2. a = 0
  3. b = 1
  4. def __init__(self):
  5. self.a = 2
  6. self.b = 3
  7. def test_func(name=None):
  8. print('I am {}'.format(name))
  9. @staticmethod
  10. def static_test():
  11. print('static_test')
  12. @classmethod
  13. def class_test(cls):
  14. print('class_test')
  15. myTestDict = MyTestDict()
  16. print(MyTestDict.__dict__)
  17. 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__实例化类:

这里要注意:利用__dict__实例化的时候,一定要在最后加上(),否则实例化不了

print(MyTestDict.__dict__["test_func"](name='XiaoMing'))

I am XiaoMing

二、在另外一个py文件调用:

official.py文件内容:

  1. class MyTestDict(object):
  2. a = 0
  3. b = 1
  4. def __init__(self):
  5. self.a = 2
  6. self.b = 3
  7. def test_func(name=None):
  8. print('I am {}'.format(name))
  9. @staticmethod
  10. def static_test():
  11. print('static_test')
  12. @classmethod
  13. def class_test(cls):
  14. print('class_test')
  15. # 如果在class外部,则在import这个py文件的时候,可以通过official.__dict__['test_func_Out'](name='Tom')来调用
  16. def test_func_Out(name=None):
  17. print('I am {}'.format(name))
  18. return name

另外一个py文件:

这样可以调用另外py文件中的方法

  1. import official
  2. print(official.__dict__['test_func_Out'](name='Tom'))

I am Tom
Tom
 

三、为什么要使用__dict__?

其实一个很关键的原因是因为这样可以在import一些py文件的时候,可以通过自定义的args参数来指定使用哪个model(特别是当你有多个想要调用的model进行测试的时候),直接调整args的参数就可以了,很方便。否则的话你每次换一个模型进行测试,都需要重新写一次import XXX

例如在RCG中:

  1. # load model
  2. pretrained_encoder = models_pretrained_enc.__dict__[args.pretrained_enc_arch](proj_dim=args.rep_dim)
  3. # load pre-trained encoder parameters
  4. if 'moco' in args.pretrained_enc_arch:
  5. pretrained_encoder = models_pretrained_enc.load_pretrained_moco(pretrained_encoder, args.pretrained_enc_path)
  6. elif 'simclr' in args.pretrained_enc_arch:
  7. pretrained_encoder = models_pretrained_enc.load_pretrained_simclr(pretrained_encoder, args.pretrained_enc_path)
  8. else:
  9. raise NotImplementedError

在第一步的load model中,使用了__dict__[args.pretrained_enc_arch]来加载预训练的模型,然后再加载这个模型所对应的参数。

这样只需要修改args.pretrained_enc_arch]的参数就可以测试不同的预训练模型对模型带来的影响,否则话,你每次调用一个新的预训练模型,都需要重写语句。

  1. import models_pretrained_enc
  2. # 想要调用预训练模型1
  3. pretrained_encoder1 = models_pretrained_enc.ExampleModel1(proj_dim=args.rep_dim)
  4. # 想要调用预训练模型2
  5. pretrained_encoder2 = models_pretrained_enc.ExampleModel2(proj_dim=args.rep_dim)
  6. # 想要调用预训练模型3
  7. pretrained_encoder3 = models_pretrained_enc.ExampleModel3(proj_dim=args.rep_dim)

python中的__dict__ - 知乎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/655147
推荐阅读
相关标签
  

闽ICP备14008679号