我正在编写一个简单的类,它基本上接受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(而不是将代码从一种语言翻译成另一种语言),也许我可以避免像这种情况一样陷入困境:)
任何帮助都有助于阐明这个问题。
答案 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中。 args
和kwargs
没有什么特别的,你必须按照上面的说法填写它们,它们并没有神奇地填充。