我有一个方法MyClass
的Python类do_something
。我希望这个方法有一个可选参数some_param
。到目前为止代码看起来像这样:
class MyClass(object):
def __init__(self, some_param)
self.some_param = some_param
def do_something(some_param=None):
if some_param:
pass
else:
some_param = self.some_param
@staticmethod
def do_something_static(some_param):
pass
是否可以让do_something_static
和do_something
具有相同的名称?
换句话说:
如果提供some_param
,我希望do_something
成为静态方法。
如果未提供some_param
,则它不是静态方法,因为它需要访问self.some_param
。
MyClass
需要兼具两种功能,我希望将它们放在一个函数中,可以作为静态方法和非静态方法调用:是否可能?
为什么呢?我宁愿没有不同的功能做同样的事情。 do_something_static
真的听起来像“我不知道如何做得更好”。我问的是,是否可以在静态方法中访问self
,因为如果使用替换self
的必需参数调用它,我将不会这样做。
答案 0 :(得分:4)
如果我理解正确,你想要一个函数,如果它被称为方法将从self
的属性中获取它的参数,但是否则直接使用它的单个参数。您可以在Python 3中执行此操作,其中未绑定的方法是普通的旧函数(但在Python 2中没有,其中未绑定的方法要求其第一个参数是实例)。
这是一个简单的例子:
class MyClass:
def func(arg):
if isinstance(arg, MyClass):
# if we were called as arg.func(), get the actual arg value from an attribute
arg = arg.some_attribute
# do something with arg
print(arg)
# MyClass.func can be called like a static method
MyClass.func("foo")
# or as a method of an instance of MyClass
instance = MyClass()
instance.some_attribute = "bar"
instance.func()
现在,我认为如果传递给静态方法的参数可能是类的一个实例(上面的代码将错误地识别为在实例上调用方法),那么这将无法执行您想要的操作。我不认为有一个很好的方法,不需要大量的描述符工作。
答案 1 :(得分:2)
为什么不使用普通功能:
def do_something(some_param):
# do the work
pass
并在课堂上使用它:
class MyClass(object):
def __init__(self, some_param)
self.some_param = some_param
def do_something(some_param=None):
if some_param:
do_something(some_param)
else:
do_something(self.some_param)
实现只在函数内部,但您可以在方法中使用它。似乎是最简单的方法,可以避免重复功能。