class __init__接受参数但由于某种原因将它们变成元组

emi*_*ir0 1 python class

我有一个非常简单的课程:

class Item(object):
    def __init__(self, guid, sku, name):
        self.guid = guid,
        self.sku = sku,
        self.name = name
Run Code Online (Sandbox Code Playgroud)

当我创建一个对象时,例如:

item1 = Item('abc123', 1, 'abc1')
Run Code Online (Sandbox Code Playgroud)

我这样做:

print item1.guid
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

('abc123',)
Run Code Online (Sandbox Code Playgroud)

而不是预期的:

'abc123'
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

PS:name按预期工作!

Two*_*ist 6

    self.guid = guid,   # Comma means create a tuple!
    self.sku = sku,
    self.name = name
Run Code Online (Sandbox Code Playgroud)

您已经在__init__代码中自己完成了这项工作.元组由逗号构成.在某些情况下,括号只是为了避免歧义.

正确的代码如下所示:

    self.guid = guid
    self.sku = sku
    self.name = name
Run Code Online (Sandbox Code Playgroud)


aru*_*nte 6

Python 没有这样做,你就在这里:

self.guid = guid,
self.sku = sku,
Run Code Online (Sandbox Code Playgroud)

注意到那些结尾的逗号了吗?在Python中,,实际上是构造元组的。guid,说“创建一个大小为 1 的元组,并以 guid 作为元素”也是如此。删除结尾的逗号就可以了。

不幸的是,该,运算符也是函数调用和列表/字典的内联初始化中的参数分隔符,因此通常您会遇到“元组构造”为(a,b). 但它们()只是为了让解释器消除,元组构造运算符和,参数分隔符之间的歧义。如果您没有遇到这样不明确的情况(例如赋值),那么您,只需要运算符即可,即使后面没有任何内容。