【问题标题】:define class with variable number of inputs in python在python中定义具有可变数量输入的类
【发布时间】:2023-03-15 17:38:01
【问题描述】:

如何定义具有两个可能输入的类构造函数:

class MSMeshFace(object):
    def __init__(self, A=None, B=None, C=None)
    def __init__(self, A=None, B=None, C=None, D=None)

所以显然这不起作用,但这就是我希望它表现的那样。如果有人输入 A、B、C,则从这三个变量构造 MSMeshFace,否则如果有人输入 A、B、C、D,则从所有四个变量构造它。这样做的正确方法是什么,这样当我调用它时,它看起来像这样:

newFace = MSMeshFace(A, B, C)

newFace = MSMeshFace(A,B,C,D)

它们都可以正常工作,但第一个创建一个“三角形”面,第二个创建一个“四边形”。如果可能的话,我不想做类似 newFace = MSMeshFace().Quad(A,B,C,D) 的事情。

或者我应该这样做:

class MSMeshFace(object):

    def __init__(self, a= None, b= None, c= None, d= None):
            self.a = a
            self.b = b
            self.c = c
            self.d = d
            if self.d == None:
                    triangleFace = MSMeshFace(self.a, self.b, self.c)
                    return triangleFace
            else:
                    quadFace = MSMeshFace(self.a, self.b, self.c, self.d)
                    return quadFace
    def addData(self, data):
            self.data = data

这是构造该类的有效方法吗?

【问题讨论】:

  • 好吧,如果您使用默认参数,那么只需做一些if D: do_this() 的东西?因为它们具有默认值,所以您不必在创建对象时包含它们。 newface = MSMeshFace() 仍然有效
  • def __init__(self, *args) 可以取任意数量
  • @Yoriz 关心一个例子吗?
  • @TehTris 所以如果有人在调用它时忽略了 D,它仍然是 None 但无论如何它都会正确启动?只是当你调用 self.D 时它会返回 None。对吗?
  • 您已经回答了自己的问题。除了我建议if self.D is None:

标签: python class constructor


【解决方案1】:
class MSMeshFace(object):
    def __init__(self, A, B, C, D=None):
        if D is None:
            # build mesh using (A,B,C)
        else:
            # build mesh using (A,B,C,D)

 triFace = MSMeshFace(A,B,C)
 quadFace = MSMeshFace(A,B,C,D)

【讨论】:

  • if D: 总是比if D is not None 好,这也会导致一些奇怪的递归
  • 不正确 @TehTris - if D: 在 D 被赋予一个仍然是有效输入的虚假值的情况下失败(例如 0);如果有可能,if D is not None 是正确的。
  • 如果我错了,请纠正我,但是这段代码会遇到无限递归。
  • 这真的是一个单独的设计决定。你可以在你的类中只有两种方法,比如build_triangle_meshbuild_quad_mesh,然后调用相关的方法。
  • @konrad 该代码将无法正常工作,因为它会无限期地尝试调用自己。您必须更改主类或要返回的类的类名。听起来您正在尝试构建一种工厂设计模式,其中主类决定您需要哪个类,创建它并返回它。最好问一个关于设计选择的新问题,你可以获得更好的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多