假设一个C ++类有几个根据各自参数的数量和类型及顺序重载的构造函数,例如constructor(int x, int y)
和constructor(float x, float y, float z)
,我认为这两个是重载方法,其中一个使用取决于参数,对吧?那么在python中,我怎么能创建一个可以像这样工作的构造函数呢?我注意到python有def method(self, *args, **kwargs):
,所以我可以像def __init__(self, *args)
一样使用它,然后检查*args
的长度,如if len(args) == 2:
,然后按照2 if len(args) == 3
进行构造-parameters构造函数,{{1}},然后使用3参数构造函数等。那么,这有用吗?或者有没有更好的方法来使用python?或者我应该以其他方式思考可以利用python功能本身的优势?感谢〜
答案 0 :(得分:3)
通常情况下,您可以使用
的任意组合def __init__(self, x = 0.0, y = 0.0, z = 0.0)
)如果这似乎不可行,请更加努力;)如果看起来仍然不可行,请查看David的链接。
答案 1 :(得分:1)
这实际上取决于你想做什么。 * args / ** kwargs方法运行得相当好,就像delnan建议的默认参数一样。
在这种情况下,C ++和Python之间的主要区别在于 和 你想要做什么。如果你有一个需要浮点数的类,只需尝试将参数转换为浮点数。您还可以依赖默认参数来分支逻辑:
class Point(object):
def __init__(self, x=0.0, y=0.0, z=None):
# Because None is a singleton,
# it's like Highlander - there can be only one! So use 'is'
# for identity comparison
if z is None:
self.x = int(x)
self.y = int(y)
self.z = None
else:
self.x = float(x)
self.y = float(y)
self.z = float(z)
p1 = Point(3, 5)
p2 = Point(1.0, 3.3, 4.2)
p3 = Point('3', '4', '5')
points = [p1, p2, p3]
for p in points:
print p.x, p.y, p.z
当然,你不必分配self.z = None
,这只是为了方便我的例子。
有关使用哪种模式的最佳建议,
在[17]中:导入这个 蒂姆·彼得斯的Python之禅
美丽胜过丑陋 明确比隐含更好 简单比复杂更好 ...
如果您的图案漂亮,明确且简单,那么它可能是正确的图案。
答案 2 :(得分:0)
I think these two are overloaded methods, which one to use depends on the parameters, right?
对不起,如果我好像在挑剔,只是想把这个差别清楚地说出来。
术语参数和参数在C ++中具有非常特殊的含义
参数:逗号分隔列表中的表达式,由函数调用表达式中的括号限定,逗号分隔列表中的预处理标记序列由类似函数的宏调用中的括号限定,throw的操作数,或由模板实例化中的尖括号限定的逗号分隔列表中的表达式,type-id或template-name。也称为实际参数或实际参数。
参数:声明为函数声明或定义的一部分的对象或引用,或者在异常处理程序的catch子句中声明的对象或引用,它在函数或处理程序的入口处获取值;来自逗号分隔列表的标识符,该列表由紧跟在类似函数的宏定义中的宏名称后面的括号限定;或模板参数。参数也称为形式参数或形式参数
答案 3 :(得分:-2)
This article讨论如何在Python中创建多方法装饰器。我没有尝试过他们提供的代码,但它定义的语法看起来相当不错。以下是文章中的一个例子:
from mm import multimethod
@multimethod(int, int)
def foo(a, b):
...code for two ints...
@multimethod(float, float):
def foo(a, b):
...code for two floats...
@multimethod(str, str):
def foo(a, b):
...code for two strings...