tensorflow自顶向下源码分析---python源码中@的用法分析---“元编程”

57 篇文章 0 订阅
26 篇文章 0 订阅

>>> import tensorflow as tf

>>> tf.__version__
'1.13.1'
>>> a=tf.constant(3)
>>> type(a)
<class 'tensorflow.python.framework.ops.Tensor'>
>>> 

本文解析此两行代码的源码分析。

python 通过文件夹导入包

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源码为止。只可意会不可言传,层层调用太深了,无底洞。。。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值