Python 在类中处理预设选项的最佳方法

Python 在类中处理预设选项的最佳方法,python,class,arguments,Python,Class,Arguments,我想要一个可以用选项a、b和c初始化的类 c是一种特殊情况,我可以使用变量extend修改初始化 我目前正在寻找最好的方法来做到这一点。 此外,我希望我的IDE(在本例中为PyCharm)为我提供建议,我可以使用哪些参数来进行预设 我想出了两个办法 选项1: class-MyClass: def u u init u u;(自我、预设、扩展=无): 如果预设==“a”: self.x=1 如果预设==“b”: self.x=2 如果预设==“c”: self.x=3 如果扩展!=无: self.

我想要一个可以用选项
a
b
c
初始化的类

c
是一种特殊情况,我可以使用变量
extend
修改初始化

我目前正在寻找最好的方法来做到这一点。 此外,我希望我的IDE(在本例中为PyCharm)为我提供建议,我可以使用哪些参数来进行预设

我想出了两个办法

选项1:

class-MyClass:
def u u init u u;(自我、预设、扩展=无):
如果预设==“a”:
self.x=1
如果预设==“b”:
self.x=2
如果预设==“c”:
self.x=3
如果扩展!=无:
self.x=self.x+扩展
定义(自我):
返回f“x的值为{self.x}”
Y=MyClass(预设=“c”,扩展=3)
打印(Y)
#out:x的值是6
选项2:

类别MyClass2:
定义初始化(自):
self.x=无
def预设_a(自身):
self.x=1
def预设_b(自身):
self.x=2
def预设_c_和_扩展(自身,扩展):
self.x=3+extend
定义(自我):
返回f“x的值为{self.x}”
Y2=MyClass2()
Y2.预设_b()
打印(Y2)
#out:x的值是2
选项1在我看来更优雅,但在我的工作流程中,我不想去实现中初始化某个预设以查找选项

但这是必要的,因为我记不起是否将预设命名为
a
,或者它是否不是
a
。 选项1还不清楚我是否可以添加一个选项
extend
。 这里可能会出现这样的情况:我将预设
a
extend=3
一起使用,我想知道为什么不应用extend

因此,实际的问题是:是否有一种优雅的方式可以在不查看类实现的情况下查看预设选项?(也许是某种类型的暗示?)

选项2有此机会,通过IDE中的自动完成,我可以看到可以应用哪些预设。但它看起来不太优雅

我对你的想法很好奇

那么:

class MyClass2:
    def __init__(self, x):
        self.x = x
    @staticmethod
    def preset_a():
        return MyClass2(1)
    @staticmethod
    def preset_b():
        return MyClass2(2)
    @staticmethod
    def preset_c_with_extend(extend):
        return MyClass2(3+extend)

    def __str__(self):
        return f"The value of x is {self.x}"

Y2=MyClass2.preset_b()
print(Y2)
它确保在对象创建时设置
x
,并允许IDE自动完成。

如何:

class MyClass2:
    def __init__(self, x):
        self.x = x
    @staticmethod
    def preset_a():
        return MyClass2(1)
    @staticmethod
    def preset_b():
        return MyClass2(2)
    @staticmethod
    def preset_c_with_extend(extend):
        return MyClass2(3+extend)

    def __str__(self):
        return f"The value of x is {self.x}"

Y2=MyClass2.preset_b()
print(Y2)

它确保在对象创建时设置
x
,并允许IDE自动完成。

另一种选择是使用预设
dict
。然而,我不知道PyCharm将如何对待这个解决方案的建议

class MyClass:
    PRESETS = {"a": 1, "b": 2, "c": 3}

    def __init__(self, preset, extend=None):
        self.x = self.PRESETS.get(preset)

        if preset == "c" and extend is not None:
            self.x += extend

    def __str__(self):
        return f"The value of x is {self.x}"

请注意,使用了
dict
.get()
方法,这意味着如果尝试使用不存在的预设,则
x
将是
None

另一种选择是使用预设
dict
。然而,我不知道PyCharm将如何对待这个解决方案的建议

class MyClass:
    PRESETS = {"a": 1, "b": 2, "c": 3}

    def __init__(self, preset, extend=None):
        self.x = self.PRESETS.get(preset)

        if preset == "c" and extend is not None:
            self.x += extend

    def __str__(self):
        return f"The value of x is {self.x}"

请注意,
dict
.get()
方法被使用,这意味着如果您尝试使用一个不存在的预设,那么
x
将是
None

谢谢,这比我的选项1更好,但是@Michael Butscher的解决方案更符合我的要求。谢谢,这比我的选项1更好,然而@Michael Butscher的解决方案更符合我的要求。哇,太棒了!我喜欢它的递归部分。IDE自动完成也是可能的:)哇,太漂亮了!我喜欢它的递归部分。IDE也可以自动完成:)