编写一个接受参数的Python类
我正在写一个简单的类,这个类主要是接受三个参数,执行一系列命令,然后返回结果。
现在的问题是,我对如何在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 个回答
如果你想要要求三个参数,可以试试:
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 有两个星号——它是用来收集关键字参数到一个 映射/字典 中。args 和 kwargs 没有什么特别的地方,你必须像上面那样来填充它们,它们不会神奇地被填充。
我觉得你想要的功能定义是这样的 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。