2017-02-10 34 views

回答

2

它們在edward/models/random_variables.py定義。

導入Normal類是這樣的:

​​

這表明在尋找edward/models/__init__.py,其中有這樣一行:

from edward.models.random_variables import * 

edward/models/random_variables.py尋找,我們發現this code

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()的內置函數創建一個新的類型,即聲明瞭一個新的類。第二個參數是基類列表,這裏是edward的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