自动将方法参数分配给实例变量

时间:2021-07-13 21:39:07

标签: python class variables

Python 中是否有一种方法可以从方法参数中声明实例变量,而无需编写样板文件?

例如,是否可以自动声明 self.fooself.bar 和所有其他参数?

def __init__(self, foo, bar, ..., last):
    self.foo = foo
    self.bar = bar
    ...
    self.last = last

3 个答案:

答案 0 :(得分:0)

实际上有,虽然我认为这是一种非常丑陋的方式

class Foo:
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)


Foo(name='foo', baz=123, bar=True, last=None)

正如 Tim Roberts 在评论中所建议的,使用 namedtuple 是一种更好、更简洁的方法(您也可以看看 dataclasses.dataclass

答案 1 :(得分:0)

您可以在 __init__ 中使用关键字参数。例如:

class MyClass:
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

然后你可以使用任何你想要的关键字参数创建一个类:

>>> mc = MyClass(foo=123, bar=456, baz=789)
>>> 

这些参数被分配为类实例的属性:

>>> mc.foo
123
>>> mc.bar
456
>>> mc.baz
789
>>> 

如果您这样做,您可能需要添加一些检查,例如将它们限制为一些已知的名称集。否则,例如,不需要的名称可能会覆盖方法名称。

或者,您可以将关键字字典直接保存在类实例中,作为单个属性。这将使类与名称隔离。例如:

class MyClass:
    def __init__(self, **kwargs):
        self.args = kwargs

然后您可以通过 self.args 访问它们。

答案 2 :(得分:0)

解决方案 1

正如@Tim Roberts 所建议的,这就是使用 namedtuple 实现的方式。

from collections import namedtuple

class Foo(namedtuple("Foo", ["param1", "param2"])):
    pass # Rest of code goes here

my_class = Foo(1, 2)
my_class.param1  # returns 1

您甚至可以创建默认参数

namedtuple("Foo", ["param1", "param2"], defaults=[1, 2])

解决方案 2

或者,您可以使用 **kwargs 来设置实例变量(它不使用集合库并且可以说更容易),如果您对用户传递任何随机参数没有问题。

这是一个例子

class Foo:
    def __init__(self, **kwargs):
        super().__dict__.update(kwargs)

my_class = Foo(param1=1)
my_class.param1  # returns 1

# Doesn't force you to pass the correct parameters
random_param_class = Foo(a_made_up_parameter=2)
random_param_class.param1  # Results in an error

请记住,这些都不是标准的,大多数情况下人们只是从 __init__ 中声明实例变量。