有没有办法在 python 中使用点运算符传递参数?
Is there a way to pass arguments using the dot operator in python?
我想创建一个干净的 "smart" 方法,它可以在不传递参数的情况下执行特定操作。我有一些原则上工作的代码如下:
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
执行不同的操作。实施此代码将 return:
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
编辑:更新以参数化选项。
这是使用对象组合的东西:
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'
我想创建一个干净的 "smart" 方法,它可以在不传递参数的情况下执行特定操作。我有一些原则上工作的代码如下:
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
执行不同的操作。实施此代码将 return:
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
编辑:更新以参数化选项。
这是使用对象组合的东西:
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'