在Python中一次为对象分配多个属性

时间:2017-09-10 11:17:24

标签: python class attributes tuples

我有一个功能

def foo(a):
    first_thing = 'first' + a
    second_foo =  'second' + a + 'bar'
    return first_thing, second_foo

返回元组。 我怎样才能实现像

这样的东西
class Thing(object):
    def __init__(self, a):
        first_thing, second_foo = foo(a)
        self.first_thing = first_thing
        self.second_foo = second_foo

以更好,更自动化的方式?

我试验过:

def __init__(self, a):
        for key, value in foo(a):
            setattr(self, key, value)

但无法正确拆包。

3 个答案:

答案 0 :(得分:2)

你的函数返回一个值元组(一个2元组)而不是一个2元组的迭代。您正在迭代包含字符串的元组,并且您无法将返回的字符串解压缩为两个字符串。

您可以坚持使用原始解决方案或将项目直接解压缩到实例属性中:

self.first_thing, self.second_foo = foo(a)

对于许多属性:

_ATTR_NAMES = ('first_thing', 'second_foo')

class Thing(object)
    def __init__(self, a):
        for key, value in zip(_ATTR_NAMES, foo(a)):
            setattr(self, key, value)

答案 1 :(得分:1)

为什么不呢:

class Thing(object):
    def __init__(self, a):
        self.first_thing, self.second_foo = foo(a)

您不需要__init__()函数内的第一行。

根据您的评论,您可以在foo函数中返回字典并使用setattr(),更新的解决方案将是:

def foo(a):
    first_thing = 'first' + a
    second_foo =  'second' + a + 'bar'
    return {'first_thing': first_thing, 'second_foo': second_foo}


class Thing(object):
    def __init__(self, a):
        for k, v in foo(a).items():
            setattr(self, k, v)

答案 2 :(得分:1)

如果您的函数返回不同数量的参数,则可以从<script th:inline="javascript"> /*<![CDATA[*/ $(document).ready(function(){ var page = $("#page").val(); for(var i=1;i< page;i++){ } }); /*]]>*/ </script> 返回字典,并更新{ "type": "hlfv1", "orderers": [ { "url" : "grpc://consortium_orderer:7050" } ], "ca": { "url": "http://myorg_ca:7054", "name": "ca.example.com" }, "peers": [ { "requestURL": "grpc://myorg_peer:7051", "eventURL": "grpc://myorg_peer:7053" }, { "requestURL": "grpc://otherorg_peer:7051" } ], "keyValStore": "/home/vagrant/.composer-credentials", "channel": "mychannel", "mspID": "Org1MSP", "timeout": 300 } 属性。

foo
__dict__

请注意这种方法的注意事项,最重要的一点是缺乏对正在更新的内容的控制。