有没有办法在不创建 class 实例的情况下获取 class 实例属性?
Is there any way to get class instance attributes without creating class instance?
这是我第一个问题的 link:
所以我试图从字典中创建 class 实例,其中包含 [=30= 】 没有。例如:
class MyClass(object):
def __init__(self, value1, value2):
self.attr1 = value1
self.attr2 = value2
dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
在创建 class 实例之前,我必须从 dict
中删除这个 redundant_key
dict.pop('redundant_key', None)
new_instance = MyClass(**dict)
问题是我有几个 classes 和几个带有很多键的字典(我有几个 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
。所以问题 - 有没有办法在不创建 class 实例的情况下获取 class 实例属性?
免责声明:这回答了 OP 询问的内容(获取实例的属性),而不是他们需要的内容。这似乎是构造函数的参数列表。
你不能为所欲为。在 python 中,属性被动态添加到 class 的实例中。相同 class 的两个实例可以具有不同的属性。嗯……准确的说,有的东西叫instance属性,还有class属性。
实例属性是与 class 的实例关联的属性。 Class 属性与其定义相关联,即如果您写了 (MyClass.foo
)
如果您查看示例,属性是在 self
上的 __init__
期间添加的,因此它们是实例属性。
你可以做的是创建一个有效的实例并检查它(查看下面的 示例 ),提供 allowed_keys
的静态列表(例如作为 class 属性),或者以某种方式要求 allowed_keys
作为构造函数参数。所有这些都是一种解决方法,因为您真正需要的是不可能的。他们各有利弊。
例子:
class MyClass(object):
def __init__(self, value1, value2):
self.attr1 = value1
self.attr2 = value2
instance = MyClass(1,2) # create a valid object
instance_attributes = instance.__dict__.keys() # inspect it
print(instance_attributes)
以下是如何做您想做的事情:使用适当的参数实例化您的 类。请注意,您不是在检查 __init__
创建的属性,而是 它接受的参数。 它对它们做什么并不重要——这不是您关心的问题你正在调用构造函数。
myparams = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
usable = { k:v for k, v in myparams if k in MyClass.__init__.__code__.co_varnames }
new_instance = MyClass(**usable)
为了清晰起见,我使用了经过过滤的字典理解,但您当然可以一步完成。
PS。请注意,如果您的字典恰好包含键 self
,您就会遇到问题。 :-) 如果您不信任您的数据源,您可能希望将其过滤掉。
如果您坚持使用过于笼统的字典来初始化您的对象,只需定义 __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)
您应该提到,您需要 SQLAlchemy-Mapper-Class 的列。这是一个更容易的任务:
dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
columns = YourTable.__table__.columns.keys()
entry = YourTable(**{k: dict[k] for k in columns})
这是我第一个问题的 link:
所以我试图从字典中创建 class 实例,其中包含 [=30= 】 没有。例如:
class MyClass(object):
def __init__(self, value1, value2):
self.attr1 = value1
self.attr2 = value2
dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
在创建 class 实例之前,我必须从 dict
中删除这个redundant_key
dict.pop('redundant_key', None)
new_instance = MyClass(**dict)
问题是我有几个 classes 和几个带有很多键的字典(我有几个 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
。所以问题 - 有没有办法在不创建 class 实例的情况下获取 class 实例属性?
免责声明:这回答了 OP 询问的内容(获取实例的属性),而不是他们需要的内容。这似乎是构造函数的参数列表。
你不能为所欲为。在 python 中,属性被动态添加到 class 的实例中。相同 class 的两个实例可以具有不同的属性。嗯……准确的说,有的东西叫instance属性,还有class属性。
实例属性是与 class 的实例关联的属性。 Class 属性与其定义相关联,即如果您写了 (MyClass.foo
)
如果您查看示例,属性是在 self
上的 __init__
期间添加的,因此它们是实例属性。
你可以做的是创建一个有效的实例并检查它(查看下面的 示例 ),提供 allowed_keys
的静态列表(例如作为 class 属性),或者以某种方式要求 allowed_keys
作为构造函数参数。所有这些都是一种解决方法,因为您真正需要的是不可能的。他们各有利弊。
例子:
class MyClass(object):
def __init__(self, value1, value2):
self.attr1 = value1
self.attr2 = value2
instance = MyClass(1,2) # create a valid object
instance_attributes = instance.__dict__.keys() # inspect it
print(instance_attributes)
以下是如何做您想做的事情:使用适当的参数实例化您的 类。请注意,您不是在检查 __init__
创建的属性,而是 它接受的参数。 它对它们做什么并不重要——这不是您关心的问题你正在调用构造函数。
myparams = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
usable = { k:v for k, v in myparams if k in MyClass.__init__.__code__.co_varnames }
new_instance = MyClass(**usable)
为了清晰起见,我使用了经过过滤的字典理解,但您当然可以一步完成。
PS。请注意,如果您的字典恰好包含键 self
,您就会遇到问题。 :-) 如果您不信任您的数据源,您可能希望将其过滤掉。
如果您坚持使用过于笼统的字典来初始化您的对象,只需定义 __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)
您应该提到,您需要 SQLAlchemy-Mapper-Class 的列。这是一个更容易的任务:
dict = {'attr1': 'value1', 'attr2': 'value2', 'redundant_key': 'value3'}
columns = YourTable.__table__.columns.keys()
entry = YourTable(**{k: dict[k] for k in columns})