类似于字典的类,其键可以像属性和预定义属性一样进行获取/设置

时间:2018-10-18 23:38:10

标签: python

我想创建一个可以接受字典作为参数的类(“ MyClass”):

>>> d = {'key1', 'value1', 'key2', 'value2'}
>>> obj = MyClass(d)

字典键可以作为属性访问:

>>> obj.key1
'value1'

可以像属性一样设置字典键:

>>> obj.key2 = 'a new value'
>>> obj.key2
'a new value'

如果访问不在字典中的键,则会引发异常:

>>> obj.key3
AttributeError: 'MyClass' object has no attribute 'key3'

还有一些不在字典中但可以设置的有效属性。 MyClass会在内部了解它们。

>>> obj.valid_attribute1 = 'this is a valid attribute'

不允许使用其他属性(无效):

>>> obj.invalid_attribute = 5
AttributeError: 'MyClass' object has no attribute 'invalid_attribute'

我认为这类似于Pandas系列对象的工作方式:

>>> import pandas as pd
>>> import numpy as np
>>> s = pd.Series(np.array([1,2]),index=['a','b'])
>>> s.a = 3
>>> s
a    3
b    2
dtype: int32

2 个答案:

答案 0 :(得分:0)

namedlist(https://pypi.org/project/namedlist/)似乎是一个不错的解决方案:

>>> from namedlist import namedlist
>>> MyClass = namedlist('MyClass', ['key1','key2'])
>>> d = {'key1': 'value1', 'key2': 'value2'}
>>> obj = MyClass(**d)
>>> obj.key2 = 'a new value'
>>> obj.key2
'a new value'

>>> obj.key3 = 'invalid'

AttributeError: 'MyClass' object has no attribute 'key3'

答案 1 :(得分:0)

您正在考虑<html> <body> <button onclick="myFunction()">Try it</button> <p id="demo"></p> </body> </html>

假设您的班级名为namedtuple

Player

您也可以像其他任何课程一样启动它

from collections import namedtuple

Player = namedtuple('Player', ['attr1', 'attr2', 'attr3'])
Player(**your_dict) # Assuming your dict has {attr1: v, attr2: v..) etc

通过

访问其成员
player = Player(attr1, attr2, attr3)

不能设置另一个您没有在开始时设置的参数

player.attr1