建立文件
np_cn.py 如下
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy
def 变换形状(序列, 新形状, 顺序='C'):
return numpy.reshape(a = 序列, newshape = 新形状, order = 顺序)
def 有序序列(*args, **kwargs):
return numpy.arange(*args, **kwargs)
然后导入改文件,运行两个函数都没有问题,
from np1 import np_cn_9 as nmp
nmp.变换形状( nmp.有序序列(9),(3,3))
结果是:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
运行 nmp.有序序列(9).变换形状( (3,3))
结果为
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-7-ce82a699b849> in <module>()
----> 1 nmp.有序序列(9).变换形状( (3,3))
AttributeError: 'numpy.ndarray' object has no attribute '变换形状'
如果不想把这些函数都放到一个类中,应该如何写代码才能实现链式操作,目前个人想法是用装饰器,还没想好怎么用。谢谢!
fzhyzamt
2020-03-27 18:17:42 +08:00
大概这样?
```python
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
current_module = sys.modules[__name__]
class Chain:
def __init__(self, *args):
self.args = args
def __getattr__(self, item):
raw_func = getattr(current_module, item)
def _inner(*args):
chain = raw_func(*self.args, *args)
self.args = chain.args
return chain
return _inner
def a(*args):
print('func[a]', *args)
return Chain(f'Result:a{str(args)}')
def b(*args):
print('func[b]', *args)
return Chain(f'Result:b{str(args)}')
a(1, 2, 3).b(4, 5).a(7, 7, 7).a(6, 6)
```
输出:
```
func[a] 1 2 3
func[b] Result:a(1, 2, 3) 4 5
func[a] Result:b('Result:a(1, 2, 3)', 4, 5) 7 7 7
func[a] Result:a("Result:b('Result:a(1, 2, 3)', 4, 5)", 7, 7, 7) 6 6
```
pebble329
2020-03-29 13:16:24 +08:00
第一次提问,谢谢大家的答复。
暂时还是继承了一个对象
import numpy
class cn_array(np.ndarray):
def __new__(cls, input_array, info=None):
obj = np.asarray(input_array).view(cls)
return obj
def __array_finalize__(self, obj):
if obj is None: return
def 一序列(形状, 数据类型=None, 顺序='C'):
return cn_array(numpy.ones(shape = 形状, dtype = 数据类型, order = 顺序))
def 变换形状(序列, 新形状, 顺序='C'):
return cn_array(numpy.reshape(a = 序列, newshape = 新形状, order = 顺序))
序列 1 = cn_array
序列 1.一序列(9).变换形状((3,3))
运行结果是
cn_array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
结果还可以接受,就是不能使用类似 'inport numpy as np' 这样的句子了!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/656806
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.