如何获取类实例变量,python

2024-10-01 07:10:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想获得__init__参数的名称,并在代码运行时修改它们。我的班级是这样的:

class Sample:
    def __init__ (self,indicators:dict):
        self.names = []
        self.returns = 0.0
        for k,v in indicators.items():
            setattr(self, k, v)
            self.names.append(k)

该类的输入是从lis中随机选择的项目;然后我将这些随机项分配给一个具有整数值的字典

indicatorsList =["SMA", "WMA", "EMA", "STOCHASTIC", "MACD", "HIGHEST_HIGH",
                 "HIGHEST_LOW", "HIGHEST_CLOSE", "LOWEST_HIGH", "LOWEST_LOW",
                 "LOWEST_CLOSE", "ATR", "LINGRES", "RSI", "WRSI", "ROC",
                 "DAY", "MONTH"]

# initializing the value of n
n = random.randint(2,int(math.ceil(len(indicatorsList)/2)))
randomIndList = n * [None]
for i in range(n):
    choice = random.choice(indicatorsList)
    randomIndList[i] = choice

...
...

sample = Sample(randDict)

问题是,我不知道__init__中这些参数的名称,我需要在以后修改它们,例如:

sample.sma = random.randint(0, maxVal)

但是我不知道这个对象是否会有sma,或者ema,或者任何其他属性,因为它们是随机分配的


Tags: sampleinself名称for参数namesinit
1条回答
网友
1楼 · 发布于 2024-10-01 07:10:29

首先,此代码:

sample.sma = random.randint(0, maxVal)

工作,即使sample没有sma属性。它将创建一个。你自己试试看

但是,正如您在注释中指定的那样,您只想修改已经存在的属性,这在这种情况下没有帮助

使用现有的类定义,可以做的是在已经定义的names属性上循环

for name in sample.names:
    setattr(sample, name, random.randint(0, maxVal))

然而,您基本上已经在这里重新创建了一个字典,那么为什么不重新定义类以直接使用字典呢

class Sample:
    def __init__(self, indicators:dict):
        self.indicators = indicators

现在您不再需要动态setattrgetattr查找。它们只是键和值:

for key in sample.indicators:
    sample.indicators[key] = random.randint(0, maxVal)

(这也意味着不需要单独的names属性。)

相关问题 更多 >