V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jsonzz
V2EX  ›  Python

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

  •  
  •   jsonzz · 2017-07-05 15:12:43 +08:00 · 1859 次点击
    这是一个创建于 2696 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教个问题,感谢~ 问题: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
    
    
    7 条回复    2017-07-06 10:55:42 +08:00
    Kilerd
        1
    Kilerd  
       2017-07-05 16:32:28 +08:00 via iPhone
    inspect package
    functools.partial
    jsonzz
        2
    jsonzz  
    OP
       2017-07-05 16:57:36 +08:00
    @Kilerd 感谢回复!!抱歉我的问题可能没说清楚。我想实现的效果是:
    ```python

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

    ```
    Kilerd
        3
    Kilerd  
       2017-07-05 17:18:35 +08:00 via iPhone
    @jsonzz 那就在 C1 里面 override swimming 函数就行了
    jsonzz
        4
    jsonzz  
    OP
       2017-07-05 17:31:35 +08:00
    @Kilerd 感谢你的回复。目前遇到的问题是 C 是工具类,内部有很多方法。C1 继承 C,C1 是调用类,使用 C1 调用 C 方法,参数必须需要处理一下。override 是不是太复杂了,因为 C 有很多方法
    keakon
        5
    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
        6
    Kilerd  
       2017-07-05 19:09:46 +08:00 via iPhone
    @jsonzz 因为你写的例子里面,override 是可行的。
    但是在真正的项目里面复杂很多,所以你可以考虑下 override __getattribute__ 这个函数。
    jsonzz
        7
    jsonzz  
    OP
       2017-07-06 10:55:42 +08:00
    @Kilerd
    @keakon 非常感谢两位,提供思路!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5097 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:45 · PVG 13:45 · LAX 21:45 · JFK 00:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.