如何在Python类中实现子方法?
抱歉,如果我之前没有表达清楚。我想做的是这个:
class someClass(object):
def aMethod(self, argument):
return some_data #for example a list or a more complex datastructure
def aMethod_max(self, argument):
var = self.aMethod(argument)
#do someting with var
return altered_var
或者我可以这样做:
def aMethod(self, argument):
self.someVar = some_data
return some_data #for example a list or a more complex datastructure
def aMethod_max(self, argument):
if not hasattr(self, someVar):
self.aMethod(argument)
#do someting with self.var
return altered_var
但我觉得这样太复杂了,希望能找到一个更优雅的解决方案。我希望现在你能明白我想要实现的目标。
因此,我想象了一些类似下面的内容。
class someClass(object):
someMethod(self):
#doSomething
return result
subMethod(self):
#doSomething with the result of someMethod
Foo = someClass()
Foo.someMethod.subMethod()
或者如果某个方法有一个参数,像这样
Foo.someMethod(argument).subMethod()
我该如何在Python中做到这一点呢?
编辑:或者像这样?
subMethod(self):
var = self.someMethod()
return doSomething(var)
相关问题:
5 个回答
1
我不太确定我理解得对不对,但你可能是这个意思:
Foo.subMethod(Foo.someMethod())
这段代码是把某个方法(someMethod())的结果传递给另一个方法(subMethod())。你需要修改一下现在的subMethod()定义,让它可以接受someMethod()的结果。
1
当某个方法的结果是某个类的实例时,你可以使用方法链。
下面是一个简单的例子:
>>> class someClass:
... def someMethod(self):
... return self
... def subMethod(self):
... return self.__class__
...
>>> x=someClass()
>>> x
<__main__.someClass instance at 0x2aaaaab30d40>
>>> x.someMethod().subMethod()
<class __main__.someClass at 0x2aaaaab31050>
3
我们来对比一下你问题中提到的现有解决方案(你称之为“复杂”和“不优雅”)和你提出的替代方案。
现有的解决方案让你可以写:
foo.subMethod() # foo.someMethod() is called internally
而你提出的替代方案则意味着你必须写:
foo.someMethod().subMethod()
这显然要麻烦得多。
另一方面,如果 subMethod 需要能够修改 任何 方法的结果,而不仅仅是 someMethod,那么现有的解决方案就意味着你需要写:
foo.subMethod(foo.anyMethod())
唯一的缺点就是你需要输入 foo 两次,而不是一次。
总结:总体来说,现有的解决方案比你提出的替代方案要简单和优雅得多,所以还是用现有的解决方案吧。