匿名类继承

时间:2011-04-20 23:17:21

标签: inheritance python

我正在围绕设备配置构建一个python自动化API,看起来像这样......

root@EX4200-24T# show interfaces ge-0/0/6 
mtu 9216;
unit 0 {
    family ethernet-switching {
        port-mode trunk;
        vlan {
            members [ v100 v101 v102 ];
        }
    }
}

root@EX4200-24T#

我正在为某些动作(如SET)定义python类,以及动作关键字的类......想法是SET将遍历关键字类并将类对象附加到接口。 / p>

问题是这个设备的配置非常分层......例如,如果有很多ethernet-switching个实例,我不希望API用户必须使用:

# Note that each keyword corresponds to a python class that is appended
# to an InterfaceList object behind the scenes...
SET(Interface='ge-0/0/6.0', Family='ethernet-switching', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/7.0', Family='ethernet-switching', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/8.0', Family='ethernet-switching', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])

相反,我希望能够使用:

Family('ethernet-switching')
SET(Interface='ge-0/0/6.0', PortMode='trunk', Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/7.0', PortMode='trunk', Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/8.0', PortMode='trunk', Vlan=['v100', 'v101', 'v102'])
Family(None)
# API usage continues...

然而,我无法想出一种在python中编写代码的方法而不诉诸这样的东西......

f = Family('ethernet-switching')
f.SET(Interface='ge-0/0/6.0', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
f.SET(Interface='ge-0/0/7.0', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])
f.SET(Interface='ge-0/0/8.0', PortMode='trunk', 
    Vlan=['v100', 'v101', 'v102'])

在我需要SET()从多个类继承之前,这一点并没有那么糟糕......比如...

首选API

# Note: there could be many combinations of classes to inherit from
Family('ethernet-switching')
PortMode('trunk')
SET(Interface='ge-0/0/6.0', Vlan=['v100', 'v101', 'v102'])
SET(Interface='ge-0/0/7.0', Vlan=['v100', 'v101', 'v102'])
PortMode('access')
SET(Interface='ge-0/0/8.0', Vlan=['v100'])
SET(Interface='ge-0/0/9.0', Vlan=['v100'])
Family(None)
PortMode(None)

有没有pythonic方法来实现我的最后一个API示例?如果没有,你能分享一些关于如何编写类层次结构的想法吗?

3 个答案:

答案 0 :(得分:10)

这样的事情对你有帮助吗?

from functools import partial
S=partial(SET, Family='ethernet-switching', PortMode='trunk')
S(Interface='ge-0/0/6.0', Vlan=['v100', 'v101', 'v102'])
S(Interface='ge-0/0/7.0', Vlan=['v100', 'v101', 'v102'])
S(Interface='ge-0/0/8.0', Vlan=['v100', 'v101', 'v102'])

答案 1 :(得分:2)

gnibbler使用functools.partial确实是一种优雅的方法,但是如果你想看一个真正的隐式基于上下文的方法,我建议探索decimal.getcontext()decimal.setcontext()decimal.localcontext()下面的实现细节。 {{1}}。

文档位于:http://docs.python.org/py3k/library/decimal 源代码位于:http://hg.python.org/cpython/file/default/Lib/decimal.py#l435

答案 2 :(得分:1)

这类似于jQuery选择&过滤API,它们使用函数链:

some_set_of_data
    .filter(first_criteria)
        .filter(second_criteria)

他们还引入了end()方法,允许您执行以下操作:

some_set_of_data
    .filter(first_criteria)
        .filter(second_criteria)
            .do_something()
        .end()
        .do_something_else()

请注意,在此示例中,对do_something()first_criteria过滤的数据调用second_criteria,仅对{{1}过滤的数据调用do_something_else() }}

在Python中复制这种与JavaScript有很多共同点的方法应该相当容易。