在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
替换)的数字,而不是列表。再次感谢。