Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中有没有使用点运算符传递参数的方法?_Python_Class_Overloading_Argument Passing - Fatal编程技术网

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

在python中有没有使用点运算符传递参数的方法?,python,class,overloading,argument-passing,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:

我想创建一个干净的“智能”方法,它执行特定的操作而不传入参数。我有一些原则上可行的代码,如下所示:

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
方法用于对
spam
ham
执行不同的操作。实现此代码将返回:

foo = Foo()
foo.bar(foo.spam)                      # returns 'spamspam'
foo.bar(foo.ham)                       # returns 'hamhamham'
不幸的是,我不得不使用
foo
两次来访问
bar
中的特定操作,这既尴尬又乏味。有没有一种更干净、更通俗的方法可以在不传递参数的情况下获得相同的结果?例如,是否可以重载点(.)运算符以获得与以下相同的结果:

# 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     

编辑:更新以参数化选项

下面是一些使用对象合成的内容:

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'

您可以将
bar
设置为类而不是def,然后在bar上重载
\uuu getattribute\uuuu
。这里有一个问题-为什么要为这两个调用
bar
?为什么不创建一个
foo.barspam()
和一个
foo.barham()
?其中每一个都可以在内部调用带有适当参数的
bar
方法,而最终调用方不需要关心这些参数。如果这些实际上是您正在引用的固定内部变量,那么动态地分派它似乎很愚蠢。谢谢@wim。在我编辑之前,您的建议是合适的(理想1)。我会试试这个。不确定它如何/是否适用于理想2。@Amber这对于编写的理想1案例来说是一个很好的观点,因此我进行了编辑以添加理想2(我真正想要的)。我希望用户能够灵活地使用
foo.spam
访问属性,或者使用
foo.spam.bar
快速返回操作。谢谢。我认为
\uuu getattr\uuu
可以满足您的需要。回答得好!这几乎解决了我的问题。为了完整性,我建议添加适当的条件语句以返回正确的
foo.ham.bar
@我会等你编辑然后接受答案,或者我可以帮你编辑。非常感谢。@pylang有很多种给猫去皮的方法,但我认为参数化你想要打印的次数是一个好方法。如果你想找别的东西,请告诉我。谢谢@salparadise,你优雅地回答了我的问题。仅供读者参考-此方法在使用传递字符串时非常有效<代码>\uuuu repr\uuuu显示返回str并将obj表示形式更改为字符串。但是,传入其他类型也不起作用,即使用(用
\uuuuuu repr\uuuuuu
替换
\uuuu int\uuuuu
\uuuuu float\uuuuu
替换
)的数字,而不是列表。再次感谢。