Skip to main content
 首页 » 编程设计

python之有没有办法在不创建类实例的情况下获取类实例属性

2025年05月04日47yxwkf

这是我第一个问题的链接:Creating class instance from dictionary?
所以我试图从字典创建类实例,它包含类没有的键。例如:

class MyClass(object): 
    def __init__(self, value1, value2): 
        self.attr1 = value1 
        self.attr2 = value2 
 
dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'} 

在创建类实例之前,我必须从字典中删除这个redundant_key

dict.pop('redundant_key', None) 
new_instance = MyClass(**dict) 

问题是我有几个类和几个带有很多键的字典(我有几个 json 格式的响应,表示为字典,我想从这个 json 响应创建对象)。我已经从上一个问题中找到了一个临时解决方案——如何删除冗余键。我只能使用我需要的键从旧字典创建新字典:

new_dict = {key: old_dict[key] for key in allowed_keys} 

代码如下:

class MyClass(object): 
    def __init__(self, value1, value2): 
        self.attr1 = value1 
        self.attr2 = value2 
 
dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'} 
new_instance = MyClass(**{key: dict[key] for key in allowed_keys}) 

我现在需要的是获取allowed_keys。所以问题 - 有没有办法在不创建类实例的情况下获取类实例属性?

请您参考如下方法:

如果您坚持使用过于笼统的字典来初始化您的对象,只需定义__init__即可。接受但忽略额外的键。

class MyClass(object): 
    def __init__(self, attr1, attr2, **kwargs): 
        self.attr1 = attr1 
        self.attr2 = attr2 
 
d = {'attr1': 'value1', 'attr2': 'value2', 'extra_key': 'value3'} 
new_instance = MyClass(**d) 

如果不能修改__init__ (如果它继承自 SQLAlchemy 声明性基础,情况似乎就是如此),添加一个替代构造函数来接受所有关键字参数,但挑选出您需要的参数。

class MyClass(Base): 
    @classmethod 
    def from_dict(cls, **kwargs): 
        # Let any KeyErrors propagate back to the caller. 
        # They're the one who forgot to make sure **kwargs 
        # contained the right keys. 
        value1 = kwargs['attr1'] 
        value2 = kwargs['attr2'] 
        return cls(value1, value2) 
 
new_instance = MyClass.from_dict(**d)