有没有办法在python中使用点运算符传递参数?

时间:2015-04-01 01:07:12

标签: python class overloading argument-passing

我想制作一个干净的,“智能”的方法,在不传递参数的情况下执行特定的操作。我有一些代码原则上如下工作:

class Foo():
    def __init__(self, spam='spam', ham='ham'):
        self.spam = spam
        self.ham = ham

    def bar(self, arg):
        # spam operation
        if arg == self.spam:
            return self.spam*2
        # ham operation
        elif arg == self.ham:
            return self.ham*3

请注意,编写bar方法是为了对spamham执行不同的操作。实现此代码将返回:

foo = Foo()
foo.bar(foo.spam)                      # returns 'spamspam'
foo.bar(foo.ham)                       # returns 'hamhamham'

不幸的是,我不得不两次使用foo来访问bar中的特定操作,这很尴尬和乏味。是否有一种更清晰,更Pythonic的方式来获得相同的结果而不传递参数?例如,是否可以将点(。)运算符重载为获得相同的结果:

# Ideal 1
foo = Foo()
foo.bar.spam                          # bar knows to use spam operation
foo.bar.ham                           # bar knows to use ham operation    

甚至更好

# Ideal 2
foo = Foo()
foo.spam.bar                          # bar knows to use spam operation
foo.ham.bar                           # bar knows to use ham operation     

1 个答案:

答案 0 :(得分:1)

编辑:已更新以参数化选项。

以下是使用对象组合的内容:

class Pork(object):
    def __init__(self, name, mult):
        self.name = name
        self.mult = mult

    @property
    def bar(self):
        return self.name * self.mult

    def __repr__(self):
        return self.name

class Foo(object):
    def __init__(self, spam='spam', ham='ham'):
        self.spam = Pork(spam, 2)
        self.ham = Pork(ham, 3)

结果:

In [638]: foo = Foo()

In [639]: foo.spam.bar
Out[639]: 'spamspam'
In [641]: foo.ham.bar
Out[641]: 'hamhamham'