1
xpresslink 2020-03-27 17:17:07 +08:00
如果要实现 XX.m1().m2().m3()这种链式调用模式。
那么 XX.m1()的返回结果必然要是一个包含 m2 方法(属性)的类, 同理 m2()的返回结果必然要是一个包含 m3 方法(属性)的类 这些都是绕不过去的,是不是把 m1~3 都写在一个类里面不绝对。 可是为了方便传递数据,用一个类可能方便一点,例如给类加一个_data = {}/[] 属性存储数据结果。 |
2
xpresslink 2020-03-27 17:18:01 +08:00
上面的类的说得不准确,应该是对象。
|
3
xpresslink 2020-03-27 17:23:49 +08:00
>>> ['abc'].pop().find('b').__bool__()
True |
4
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 ``` |
5
alxia 2020-03-28 10:23:28 +08:00
试了一下 np.array 禁止动态绑定属性,所以你想要的效果是无法实现的,只能自己写类
|
6
pebble329 OP 第一次提问,谢谢大家的答复。
暂时还是继承了一个对象 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' 这样的句子了! |