[英]where is the location of class Normal in edward's source code?
它们在edward/models/random_variables.py
中定义。
您可以这样导入Normal
类:
from edward.models import Normal
这建议您查看edward/models/__init__.py
,其中包含以下行:
from edward.models.random_variables import *
在edward/models/random_variables.py
查找以下代码 :
from edward.models.random_variable import RandomVariable as _RandomVariable
from tensorflow.contrib import distributions as _distributions
# Automatically generate random variable classes from classes in
# tf.contrib.distributions.
_globals = globals()
for _name in sorted(dir(_distributions)):
_candidate = getattr(_distributions, _name)
if (_inspect.isclass(_candidate) and
_candidate != _distributions.Distribution and
issubclass(_candidate, _distributions.Distribution)):
# to use _candidate's docstring, must write a new __init__ method
def __init__(self, *args, **kwargs):
_RandomVariable.__init__(self, *args, **kwargs)
__init__.__doc__ = _candidate.__init__.__doc__
_params = {'__doc__': _candidate.__doc__,
'__init__': __init__}
_globals[_name] = type(_name, (_RandomVariable, _candidate), _params)
del _candidate
这将通过tensorflow.contrib.distributions
模块查找从tensorflow.contrib.distributions.Distribution
派生的类(忽略其他属性,例如模块的__file__
成员或基本Distribution
类本身)。 对于每一个,它都会进行一些黑客操作(这只会影响生成的文档),然后执行以下关键行:
_globals[_name] = type(_name, (_RandomVariable, _candidate), _params)
type()
内置函数创建一个新类型,即声明一个新类。 第二个参数是基类列表,这里是爱德华的RandomVariable
类和TensorFlow随机变量类。 之前它将_globals
定义为globals()
,这是一个内置函数,返回模块变量的字典。 因此,在您感兴趣的情况下,上面的行等效于以下内容:
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
Normal = type("Normal", (EdRandVar, TfNormal), {...})
这又等效于此(如果您忽略文档字符串的内容):
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
class Normal(EdRandVar, TfNormal):
pass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.