在python中编写一个接受参数的类

时间:2011-08-13 00:24:52

标签: python

我正在编写一个简单的类,它基本上接受3个参数,执行一系列命令并返回结果。

现在的问题是我不清楚如何在Python中编写一个合适的类(我主要使用C ++);所以我有点想弄清楚写什么以及如何写课程。

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

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

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程序

问题是,当我传递参数时,我得到一个错误,说明在超类__init行上没有定义全局名称“args”

在C中我会写一些类似

的内容
class testClass 
{
    string name, classID, objectType;
}string

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

如果我能够理解如何以应有的方式使用Python(而不是将代码从一种语言翻译成另一种语言),也许我可以避免像这种情况一样陷入困境:)

任何帮助都有助于阐明这个问题。

2 个答案:

答案 0 :(得分:3)

我认为您正在寻找的是像def __init__(self, name="", classId="", objectType="", *args, **kwargs):这样的函数定义。

除了3个已知参数(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对于任何函数定义都是可选的。如果你提到你知道你只会传递3个参数,那么你可以删除* args,** kwargs。

答案 1 :(得分:0)

如果您想要3个参数,请尝试:

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有两颗星 - 它将关键字参数收集到mapping / dictionary中。 argskwargs没有什么特别的,你必须按照上面的说法填写它们,它们并没有神奇地填充。