Я по-прежнему новичок в python, и это, вероятно, будет одним из тех (глупых) скучных вопросов. Тем не менее, любая помощь будет высоко оценена. Я программирую что-то, что включает в себя множество переменных, и я решил использовать класс для инкапсуляции всех переменных (надеюсь, упростить «чтение» для меня со временем), но он не работает, как я думал. Таким образом, без дальнейших церемоний здесь есть часть класса, который захватывает суть.Использование класса для определения нескольких переменных в python
import numpy as np
class variable:
def __init__(self, length):
self.length = length # time length`
def state_dynamic(self):
length = self.length
return np.zeros((2, np.size(length)))
def state_static(self):
length = self.length
return np.zeros((2, np.size(length)))
def control_dynamic(self):
length = self.length
return np.zeros((2, np.size(length)))
def control_static(self):
length = self.length
return np.zeros((2, np.size(length)))
def scheduling(self):
length = self.length
return np.zeros(np.size(length))
def disturbance(self):
length = self.length
dummy = np.random.normal(0., 0.1, np.size(length))
for i in range(20):
dummy[i+40] = np.random.normal(0., 0.01) + 1.
dummy[80:100] = 0.
return dummy
Я также попытался это один:
import numpy as np
class variable:
def __init__(self, type_1, type_2, length):
self.type_1 = type_1 # belongs to set {state, control, scheduling, disturbance}
self.type_2 = type_2 # belongs to set {static, dynamic, none}
self.length = length # time length
def type_v(self):
type_1 = self.type_1
type_2 = self.type_2
length = self.length
if type_1 == 'state' and type_2 == 'dynamic':
return np.zeros((2, np.size(length)))
elif type_1 == 'state' and type_2 == 'static':
return np.zeros((2, np.size(length)))
elif type_1 == 'control' and type_2 == 'dynamic':
return np.zeros((2, np.size(length)))
elif type_1 == 'control' and type_2 == 'static':
return np.zeros((2, np.size(length)))
elif type_1 == 'scheduling' and type_2 == 'none':
return np.zeros(np.size(length))
elif type_1 == 'disturbance' and type_2 == 'none':
dummy = np.random.normal(0., 0.1, np.size(length))
for i in range(20):
dummy[i+40] = np.random.normal(0., 0.01) + 1.
dummy[80:100] = 0.
return dummy
Теперь, используя первый (результат одинаковый для второго класса, а), когда я пишу следующее, скажем:
In [2]: time = np.linspace(0,10,100)
In [5]: v = variable(time)
In [6]: v1 = v.state_dynamic
In [7]: v1.size
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/<ipython-input-7-e6a5d17aeb75> in <module>()
----> 1 v1.size
AttributeError: 'function' object has no attribute 'size'
In [8]: v2 = variable(np.size(time)).state_dynamic
In [9]: v2
Out[9]: <bound method variable.state_dynamic of <__main__.variable instance at 0x3ad0a28>>
In [10]: v1[0,0]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/<ipython-input-10-092bc2b9f982> in <module>()
----> 1 v1[0,0]
TypeError: 'instancemethod' object has no attribute '__getitem__'
Я надеялся, что, написав
variable(length).state_dynamic
я доступ
np.zeros((2, np.size(length)))
Во всяком случае, если я сделал что-то совершенно дурацкий, пожалуйста, дайте мне знать :) и не стесняйтесь давать какие-либо советы. Заранее благодарю вас за ваше время и внимание. С наилучшими пожеланиями.
EDIT # 1:
@wheaties:
Спасибо за быстрый ответ и помочь :)
То, что я сейчас пытаюсь сделать следующее. Я должен построить несколько «переменных», например, состояние, контроль, отсева, планирование и нарушения. Все переменные зависят от трех параметров: динамического, статического и горизонтального. Кроме того, состояние и управление - np.zeros((2, np.size(length)))
, исключения и планирование - np.zeros(np.size(length))
, а помехи имеют конкретную форму (см. Выше). Сначала я объявил их в скрипте, и список очень длинный и выглядит уродливым. Я использую эти переменные для хранения ответов рассмотренных динамических систем и их построения. Я не знаю, если это хороший способ сделать это, и если у вас есть какие-либо предложения, пожалуйста, поделитесь.
Еще раз спасибо за помощь.
Я не думаю, что этот класс 'variable' правильно представляет понятие переменной. Во-первых, если 'v' является' переменной', то 'v.state_dynamic() не является v.state_dynamic()'. Любые изменения, внесенные в 'v.state_dynamic()', будут эффективно проигнорированы, так как при следующем доступе к 'v.state_dynamic()' вы получите новый массив. Почему бы просто не использовать фактические переменные? – user2357112