__init__ 是否有一个 Python 快捷方式,它只是设置属性?
Is there a Python shortcut for an __init__ that simply sets properties?
在 Python 中有时会经常看到 __init__
代码如下:
class SomeClass(object):
def __init__(self, a, b, c, d, e, f, g):
self.a = a
self.b = b
self.c = c
self.d = d
self.e = e
self.f = f
self.g = g
特别是如果所讨论的 class 纯粹是一个没有行为的数据结构。是否有 (Python 2.7) 的快捷方式或制作方法?
您可以使用 Alex Martelli 的 Bunch recipe:
class Bunch(object):
"""
foo=Bunch(a=1,b=2)
"""
def __init__(self, **kwds):
self.__dict__.update(kwds)
您可以使用 __new__
方法创建 class,该方法将任何 class 属性复制到对象,然后从中继承。
http://www.oreilly.com/programming/free/how-to-make-mistakes-in-python.csp 有一个例子说明为什么我刚才说的是一个应该避免的糟糕想法。
(简短版本:它不能很好地处理可变对象,处理它的变通方法不值得付出努力。)
当然可以。
Class SomeClass(object):
def __init__(self, **args):
for(k, v) in args.items():
setattr(self, k, v)
和v = SomeClass(a=1, b=2, c=3, d=4)
错误会使您的代码难以理解。
祝你好运。
您可能会发现 attrs
库很有帮助。这是来自文档 overview page 的示例:
>>> import attr
>>> @attr.s
... class SomeClass(object):
... a_number = attr.ib(default=42)
... list_of_numbers = attr.ib(factory=list)
...
... def hard_math(self, another_number):
... return self.a_number + sum(self.list_of_numbers) * another_number
>>> sc = SomeClass(1, [1, 2, 3])
>>> sc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> sc.hard_math(3)
19
如果您使用的是 Python 3.8+,则可以使用 dataclasses。
>>> from typing import List
>>> from dataclasses import dataclass, field
>>> @dataclass
... class OtherClass:
... a_number: int=42
... list_of_numbers: List[int] = field(default_factory=list)
... def hard_math(self, another_number):
... return self.a_number + sum(self.list_of_numbers) * another_number
>>> OtherClass=SomeClass
>>> oc = OtherClass(1, [1, 2, 3])
>>> oc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> oc.hard_math(3)
19
在 Python 中有时会经常看到 __init__
代码如下:
class SomeClass(object):
def __init__(self, a, b, c, d, e, f, g):
self.a = a
self.b = b
self.c = c
self.d = d
self.e = e
self.f = f
self.g = g
特别是如果所讨论的 class 纯粹是一个没有行为的数据结构。是否有 (Python 2.7) 的快捷方式或制作方法?
您可以使用 Alex Martelli 的 Bunch recipe:
class Bunch(object):
"""
foo=Bunch(a=1,b=2)
"""
def __init__(self, **kwds):
self.__dict__.update(kwds)
您可以使用 __new__
方法创建 class,该方法将任何 class 属性复制到对象,然后从中继承。
http://www.oreilly.com/programming/free/how-to-make-mistakes-in-python.csp 有一个例子说明为什么我刚才说的是一个应该避免的糟糕想法。
(简短版本:它不能很好地处理可变对象,处理它的变通方法不值得付出努力。)
当然可以。
Class SomeClass(object):
def __init__(self, **args):
for(k, v) in args.items():
setattr(self, k, v)
和v = SomeClass(a=1, b=2, c=3, d=4)
错误会使您的代码难以理解。
祝你好运。
您可能会发现 attrs
库很有帮助。这是来自文档 overview page 的示例:
>>> import attr
>>> @attr.s
... class SomeClass(object):
... a_number = attr.ib(default=42)
... list_of_numbers = attr.ib(factory=list)
...
... def hard_math(self, another_number):
... return self.a_number + sum(self.list_of_numbers) * another_number
>>> sc = SomeClass(1, [1, 2, 3])
>>> sc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> sc.hard_math(3)
19
如果您使用的是 Python 3.8+,则可以使用 dataclasses。
>>> from typing import List
>>> from dataclasses import dataclass, field
>>> @dataclass
... class OtherClass:
... a_number: int=42
... list_of_numbers: List[int] = field(default_factory=list)
... def hard_math(self, another_number):
... return self.a_number + sum(self.list_of_numbers) * another_number
>>> OtherClass=SomeClass
>>> oc = OtherClass(1, [1, 2, 3])
>>> oc
SomeClass(a_number=1, list_of_numbers=[1, 2, 3])
>>> oc.hard_math(3)
19