Python 中是否有一种方法可以从方法参数中声明实例变量,而无需编写样板文件?
例如,是否可以自动声明 self.foo
、self.bar
和所有其他参数?
def __init__(self, foo, bar, ..., last):
self.foo = foo
self.bar = bar
...
self.last = last
答案 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)
正如@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])
或者,您可以使用 **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__
中声明实例变量。