【发布时间】:2015-06-05 12:49:34
【问题描述】:
我想创建一个干净、“智能”的方法,该方法无需传入参数即可执行特定操作。我有一些原则上工作的代码如下:
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 中的特定操作,这既尴尬又乏味。有没有一种更简洁的 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
【问题讨论】:
-
您可以将
bar设为类而不是def,然后在bar 上重载__getattribute__ -
这里有个问题 - 为什么你要为这两个都打电话给
bar?为什么不直接创建foo.barspam()和foo.barham()?这些中的每一个都可以在内部调用bar方法,并使用最终调用者不需要关心的正确参数。如果这些实际上是您引用的固定内部变量,那么动态调度它似乎很愚蠢。 -
谢谢@wim。您的建议在我编辑之前是合适的(理想 1)。我会试试这个。不确定如何/是否适用于 Ideal 2。
-
@Amber 这对于写的 Ideal1 案例来说是一个很好的观点,所以我进行了编辑以添加 Ideal 2(我真正想要的)。我希望用户能够灵活地使用
foo.spam访问属性或使用foo.spam.bar快速返回操作。谢谢。 -
我觉得
__getattr__可以满足你的需要。
标签: python class overloading argument-passing