>>> import tensorflow as tf
>>> tf.__version__
'1.13.1'
>>> a=tf.constant(3)
>>> type(a)
<class 'tensorflow.python.framework.ops.Tensor'>
>>>
本文解析此两行代码的源码分析。
https://blog.csdn.net/CAIYUNFREEDOM/article/details/88578019
a@ubuntu:/usr/local$ sudo find . -type d -name "tensorflow"
[sudo] password for a:
./lib/python3.5/dist-packages/tensorflow
./lib/python3.5/dist-packages/tensorflow/include/tensorflow
-----------------------------------------------------------
./lib/python3.5/dist-packages/tensorflow/include/tensorflow目录下没有__init__.py
而./lib/python3.5/dist-packages/tensorflow有__init__.py(非空)。
说明导入的包是指 ./lib/python3.5/dist-packages/tensorflow
a@ubuntu:/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework$ ls ops*
ops.py
ops.py 有类Tensor
ops.py文件中有很多@语句。
---------------@的用法demo-------------
https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p09_define_decorators_as_classes.html
此文档内容很齐全 “元编程”
将装饰器定义为类
#!/usr/bin/python3
def a(p):
print('a',p())
@a
def c( ):
print('c start' )
return 'cturn'
print('c end' )
class Student(object):
@property
def score(self):
print('gettern ')
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 100:
raise ValueError('score must between 0 ~ 100!')
self._score = value
@property
def age(self):
print('gettern age ')
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError('age must be an integer!')
if value < 0 or value > 100:
raise ValueError('age must between 0 ~ 100!')
self._age = value
s = Student()
s.score = 44
s.age = 16
print(s.score,s.age)
#s.score = 99999
s.age = 3333
装饰器
@property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。
1、只有@property表示只读。
2、同时有@property和@*.setter表示可读可写。
3、同时有@property和@*.setter和@*.deleter表示可读可写可删除。
------------------------------tensorflow ops.py文件代码分析------
from tensorflow.python.util.tf_export import tf_export
@tf_export("Tensor")
class Tensor(_TensorLike):
.......
@property
def op(self):
...............
@tf_export("convert_to_tensor", v1=[])
def convert_to_tensor_v2(value, dtype=None, dtype_hint=None, name=None):
...............
--------------tf.constant--------------------------
在tensorflow目录下的__init__.py中有一行
from tensorflow.python.framework.constant_op import constant_v1 as constant
所以tf.constant的接口源码在
/usr/local/lib/python3.5/dist-packages/tensorflow/python/framework/constant_op.py 里。
阅读了元编程的相关文档后,tf.constant 也会执行tf_export接口代码。
。。。。
分析到这里吧。本来打算分析到C源码为止。只可意会不可言传,层层调用太深了,无底洞。。。