Python:使用 locals() 进行编程类实例变量初始化

标签 python class micropython

我有一个包含许多具有默认值的实例变量的类,可以选择在实例化中覆盖它们(注意:没有可变的默认参数)。

因为多次编写 self.x = x 等是多余的,所以我以编程方式初始化变量。

为了说明,请考虑这个示例(为了简洁起见,它只有 5 个实例变量并且省略了任何方法):

示例:

# The "painful" way
class A:
    def __init__(self, a, b=2, c=3, d=4.5, e=5):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e

# The "lazy" way
class B:
    def __init__(self, a, b=2, c=3, d=4.5, e=5):
        self.__dict__.update({k: v for k, v in locals().items() if k!='self'})

# The "better lazy" way suggested
class C:
    def __init__(self, a, b=2, c=3, d=4.5, e=5):
            for k, v in locals().items():
                if k != 'self':
                    setattr(self, k, v)

x = A(1, c=7)
y = B(1, c=7)
z = C(1, c=7)

print(x.__dict__)  # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(y.__dict__)  # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(z.__dict__)  # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}

所以为了让我的生活更轻松,我使用类 B 中显示的成语,它产生与 A 相同的结果。

这是不好的做法吗?有什么陷阱吗?

附录: 使用这个成语的另一个原因是为了节省一些空间——我打算在 MicroPython 中使用它。 . 无论什么原因 Because locals work differently there ,只有 A 类中显示的方式在其中起作用。

最佳答案

我实际上建议使用 class A 中显示的代码。您拥有的是重复 代码,而不是冗余代码,而且重复总是 不好。您只需编写一次 __init__,并且为每个实例变量保留一个赋值是很好的文档(明确且清晰),说明您的类需要哪些实例变量。

但要记住的一件事是,太多您可以初始化为不同参数的变量可能表明您的类需要重新设计。将一些单独的参数分组到单独的列表、字典甚至其他类中是否更有意义?

关于Python:使用 locals() 进行编程类实例变量初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40899883/

相关文章:

python - Django ImageKit : How to rename uploaded images?

python - 从 Mercurial API 获取提示修订信息

javascript - 自动单击 Javascript 按钮错误 - Mechanize 或 Selenium 不走运

java - 匹配全限定类名的正则表达式

objective-c - 有没有办法在 Objective-C 上动态解析类方法?

pypi - 无法使用upip在esp32上安装uasyncio包

python - Flask 日志记录错误 : "TypeError findCaller() takes from 1 to 2 position arguments but 3 were given" on app. 运行(Python 3.8)

python - python-如何将C函数实现为可等待的(协程)

python - 如何配置 pylint/python 来检查 MicroPython 语法?

javascript 不同的 OOP 方法标准