python对象中的隐式项赋值

2024-06-28 11:31:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想能够赋值给类的属性而不指定它们。你知道吗

我想做什么工作

A)


class HoldingStuff(object):

    def __init__(self, **args):
        self.a = 1
        self.b = '1'
        self.c = 2
        self.d = '3'
        self.e = 4
        for arg in args:
            self[arg] = args[arg]

first = HoldingStuff(a=5)
second = HoldingStuff(d=2, e='2')

当然,我可以在保存值的类中使用字典。但是,这有一个很大的缺点,因为我不能对属性使用代码完成。这使得它们很难再利用和找到。(属性是模拟的可变参数的广泛列表。)

什么是有效的(不实用的)

B)


class HoldingStuff(object):

    def __init__(self, **args):
        self['a'] = 1
        self['b'] = '1'
        self['c'] = 2
        self['d'] = '3'
        self['e'] = 4
        for arg in args:
            self[arg] = args[arg]

什么是有效的

C)


class HoldingStuff(MutableMapping):

    def __init__(self, **args):
        self.a = 1
        self.b = '1'
        self.c = 2
        self.d = '3'
        self.e = 4
        for arg in args:
            self[arg] = args[arg]

    def __setitem__(self, k, v) -> None:
        if k =='a':
            self.a = v
        elif k =='b':
            self.b = v
        elif k =='c':
            self.c = v
        elif k =='d':
            self.d = v
        elif k =='e':
            self.e = v
        else:
            print(k, "Not available for class.")

    def __delitem__(self, v) -> None:
        pass

    def __getitem__(self, k) -> _VT_co:
        if k =='a':
            return self.a
        elif k =='b':
            return self.b
        elif k =='c':
            return self.c
        elif k =='d':
            return self.d
        elif k =='e':
            return self.e
        else:
            print(k, "Not available for class.")

    def __len__(self) -> int:
        return 5

    def __iter__(self):
        print("Not implemented")

函数__setitem____getitem__看起来很明显而且重复!你知道吗

问题 有没有办法将示例C)的源代码简化为示例a)的隐式工作方式?你知道吗


Tags: inselfforreturn属性objectinitdef
3条回答

不能评论,因为我的声望不到50。 在方案a中

class HoldingStuff(object):

    def __init__(self, **args):
        self.a = 1
        self.b = '1'
        self.c = 2
        self.d = '3'
        self.e = 4
        for arg in args:
            self[arg] = args[arg]

first = HoldingStuff(a=5)
second = HoldingStuff(d=2, e='2')

你有台词:

for arg in args:
    self[arg] = args[arg]

但是你插入一个字符串并试图找到它的args索引

second  = HoldingStuff(d=2, e='2') #e='2'

我认为你应该尝试使用:

for arg in range(len(args)):
    self[args[arg]] = args[arg]

感谢您的评论,帮助我找到:

https://stackoverflow.com/a/6760593/3707039

提供了一个优雅的解决方案


class HoldingStuff(object):

    def __init__(self, **args):
        self.a = 1
        self.b = '1'
        self.c = 2
        self.d = '3'
        self.e = 4
        vars(self).update(args)

使用setattr。你知道吗

for name, value in args.items():
    setattr(self, name, value)

相关问题 更多 >