python - 如何使用构造函数关键字参数指定 Python 类属性
问题描述
我试图想出一种方法来允许在实例化时指定任意数量的类属性,这与字典非常相似。理想用例:
>>> instance = BlankStruct(spam=0, eggs=1)
>>> instance.spam
0
>>> instance.eggs
1
其中 BlankStruct 定义为:
class BlankStruct(Specifiable):
@Specifiable.specifiable
def __init__(self, **kwargs):
pass
我正在考虑使用父类装饰器,但在思考是否使用实例方法、类方法或静态方法(或者可能不使用以上任何方法!)时迷失了方向。这是迄今为止我想出的最好的,但问题是属性被应用于类而不是实例:
class Specifiable:
@classmethod
def specifiable(cls, constructor):
def constructor_wrapper(*args, **kwargs):
constructor(*args, **kwargs)
cls.set_attrs(**kwargs)
return constructor_wrapper
@classmethod
def set_attrs(cls, **kwargs):
for key in kwargs:
setattr(cls, key, kwargs[key])
我怎样才能制作这样的父类?
注意: 是的,我知道我正在尝试做的是不好的做法。但有时你只需要按照老板告诉你的去做。
解决方案
是的,您可以执行以下操作,但我不建议这样做,因为这显然违反了显式优于隐式原则:
class BlankStruct:
def __init__(self, **attrs):
self.__dict__.update(**attrs)
def __getattr__(self, attr):
return self.__dict__.get(attr, None)
f = BlankStruct(spam=0, eggs=1)
此处提供了更完整的回复并启发了此答案。
我建议您明确说明您希望班级拥有的属性。否则,您将得到一个具有高度可变性的类,这可能会降低它的实用性。
推荐阅读
- sql-server-2016 - 如何使用 SQL Server 识别同一列中更改的值
- javascript - Keyboard changes all components placement in react native
- javafx - 如何在 Java FX 中创建自定义鼠标事件
- windows-10 - 如何从文本中重置编辑路径变量
- linux - Linux grep y egrip
- iis - 阻止访问视频,但允许它们在网站上显示?
- sequelize.js - 续集 Model.associations[别名]。还有另一种获取关联模型的方法吗?
- python - 我什么时候需要为异步代码使用执行器?当我不(但应该)时会发生什么?
- python-3.x - Flask Application Factory 缺少模板文件夹
- java - Firebase 系统通知自动关闭