执行类方法前,如何获取方法入参并修改

2017-07-05 15:12:43 +08:00
 jsonzz

请教个问题,感谢~ 问题:C1 类如何改动,调用 c1.swimming()时 等同于 调用 c1.swimming(c1.add_punctuation( ))。


class C(object):
    def __init__(self):
        self.name = 'zhangsan '

    def swimming(self, action):
        return self.name + action


class C1(C):
    def add_punctuation(self, text):
        return ':' + text


c1 = C1()
print c1.swimming(c1.add_punctuation('swimming'))  # >zhangsan :swimming
print c1.swimming('swimming')  # >zhangsan swimming

1764 次点击
所在节点    Python
7 条回复
Kilerd
2017-07-05 16:32:28 +08:00
inspect package
functools.partial
jsonzz
2017-07-05 16:57:36 +08:00
@Kilerd 感谢回复!!抱歉我的问题可能没说清楚。我想实现的效果是:
```python

c1.swimming(c1.add_punctuation('swimming'))
c1.swimming('swimming')
#他们调用时等同

```
Kilerd
2017-07-05 17:18:35 +08:00
@jsonzz 那就在 C1 里面 override swimming 函数就行了
jsonzz
2017-07-05 17:31:35 +08:00
@Kilerd 感谢你的回复。目前遇到的问题是 C 是工具类,内部有很多方法。C1 继承 C,C1 是调用类,使用 C1 调用 C 方法,参数必须需要处理一下。override 是不是太复杂了,因为 C 有很多方法
keakon
2017-07-05 18:15:14 +08:00
你要做的就是修改 swimming 的实现,使用 override 不是最简单的么,看不出哪里复杂:
def swimming(self, action):
return C.swimming(self, self.add_punctuation(action)) # 或者 return super(C1, self).swimming(self.add_punctuation(action))

如果你有一堆方法需要修改参数,先写一个 decorator,用处是计算并传递新参数;然后再写个 metaclass,对满足要求的方法都应用上这个 decorator。
Kilerd
2017-07-05 19:09:46 +08:00
@jsonzz 因为你写的例子里面,override 是可行的。
但是在真正的项目里面复杂很多,所以你可以考虑下 override __getattribute__ 这个函数。
jsonzz
2017-07-06 10:55:42 +08:00
@Kilerd
@keakon 非常感谢两位,提供思路!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX