编写一个接受参数的Python类

1 投票
2 回答
1751 浏览
提问于 2025-04-16 23:31

我正在写一个简单的类,这个类主要是接受三个参数,执行一系列命令,然后返回结果。

现在的问题是,我对如何在Python中写一个合适的类不是很清楚(我主要使用C++);所以对我来说,弄明白该写什么和怎么写这个类有点奇怪。

我有三个参数:name、classID和objectType(这三个都是字符串类型),我需要返回一个包含操作结果的字符串。

到目前为止,我写了这个:

class testClass(superclass):

def __init__(self, name="",classID="", objectType="" *kwargs):

    superclass.__init__(self, args, **kwargs)

    result = ""
    ...(do the operation with the parameters, if the result is positive return OK
        otherwise return KO)

然后我把它保存为testClass.py,并在我的主Python程序中导入了它。

问题是,当我传递参数时,出现一个错误,提示全局名称“args”未定义,这个错误出现在父类的__init行。

在C语言中,我只需要写类似这样的代码:

class testClass 
{
    string name, classID, objectType;
}string

程序就会知道它必须期待三个参数(然后在构造函数中处理数据验证和确认),但我无法理解如何在Python中告诉它同样的事情。

如果我能理解如何正确使用Python(而不是把一种语言的代码翻译成另一种),也许我就能避免像这种情况一样卡住了 :)

任何帮助都非常感谢,可以让我对这个主题有更清晰的理解。

相关问题:

2 个回答

0

如果你想要要求三个参数,可以试试:

def __init__(self, name, classID, objectType):

因为你没有提供默认值,所以这三个参数是必须的。在标准的Python中,没有办法告诉一个函数你希望它接收什么类型的参数——你只需要把它们当作字符串来使用,如果不兼容字符串操作,就会报错。如果你真的想检查参数类型,可以这样做:

if not isinstance(name, str):
    raise TypeError

你真的需要调用父类的 __init__ 吗?如果需要,可以使用 super()

super(testClass, self).__init__()

如果你想在这三个必需的参数之后,传递任何未知的参数给父类的 __init__

def __init__(self, name, classID, objectType, *args **kwargs):
    super(testClass, self).__init__(*args, **kwargs)

*args 是用来收集任何额外的非关键字参数到变量 args 中。注意 **kwargs 有两个星号——它是用来收集关键字参数到一个 映射/字典 中。argskwargs 没有什么特别的地方,你必须像上面那样来填充它们,它们不会神奇地被填充。

3

我觉得你想要的功能定义是这样的 def __init__(self, name="", classId="", objectType="", *args, **kwargs):

这个定义除了包含三个已知的参数(name、classId、objectType)之外,还定义了args,它是一个额外参数的列表,以及kwargs,它是一个包含命名参数的字典。

根据上面的__init__定义,你可以这样调用你的类:

t = testClass("name", "class1", "Object", "value1", 11, scope="local", destroy=True)

这样调用后,我们可以在__init__内部看到

name = "name"
classId= "class1"
objectType = "Object"
args =  ["value1", 11]
kwargs = { 'scope': "local",
           'destroy': True }

最后,*args 和 **kwargs 在任何函数定义中都是可选的。如果你像你提到的那样,知道只会传递三个参数,那么你可以去掉 *args 和 **kwargs。

撰写回答