2013-07-17 60 views
1

我還是新來的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))) 

無論如何,如果我做了一些極其荒唐,請讓我知道:),並隨時給任何樣的建議。提前感謝您的寶貴時間和關注。最好的祝福。

編輯#1:

@wheaties:

感謝您的快速回復和幫助:)

什麼我目前要做的是以下幾點。我必須繪製幾個「變量」,例如狀態,控制,輟學,調度和干擾。所有變量取決於三個參數,即動態,靜態和時間。此外,狀態和控制是np.zeros((2, np.size(length))),中斷和調度是np.zeros(np.size(length))和干擾具有特定形式(見上文)。最初,我在腳本中聲明瞭它們,列表很長,看起來很醜。我使用這些變量來存儲考慮的動態系統的響應並繪製它們。我不知道這是否是這樣做的好方法,如果您有任何建議,請分享。再次

感謝您的幫助。

+0

我不認爲這個'variable'類正確表示變量的概念。首先,如果'v'是一個'variable',那麼'v.state_dynamic()不是v.state_dynamic()'。您對'v.state_dynamic任何更改()'將有效地被忽略,因爲下一次訪問'v.state_dynamic()',你會得到一個新的數組。爲什麼不使用實際變量? – user2357112

回答

4

你的意思是你想命名訪問一堆狀態信息?對於類變量普通蟒蛇成語應該是這樣的:

class Variable(object): 
    def __init__ (self, state_dynamic, state_static, control_static, control_dynamic, scheduling): 
     self.state_dynamic = state_dynamic 
     self.state_static = state_static 
     self.control_static = control_static 
     self.control_dynamic = control_dynamic 
     self.scheduling = control_dynamic 

基本上創建了持有你把通過構造函數值命名字段桶。您還可以使用工廠類namedtuple來創建輕量級數據類,從而避免了一些樣板。

可能適用的

其他蟒蛇成語是使用@property decorator作爲@wheaties回答。這基本上僞裝了一個函數調用,使它看起來像一個字段。如果你正在做的事情可以減少到功能基礎,這是有道理的。這是想法的一個例子(不是基於你的問題集,因爲我不確定我在用所有那些相同的變量詳細說明你正在做什麼) - 在這種情況下,我做了一個方便的包裝器用於拉出存儲在蟒蛇數字中的個別標誌,但確實是一個位字段:

class Bits(object): 
    def __init__(self, integer): 
     self.Integer = integer # pretend this is an integer between 0 and 8 representing 4 flags 

    @property 
    def locked(self): 
     # low bit = locked 
     return self.Integer & 1 == 1 

    @property 
    def available(self): 
    return self.Integer & 2 == 2 

    @property 
    def running_out_of_made_up_names(self): 
    return self.Integer & 4 == 4 

    @property 
    def really_desperate_now(self): 
    return self.Integer & 8 == 8 

example = Bits(7) 
print example.locked 
# True 
print example.really_desperate_now 
# False 
+0

嗨,謝謝:)我用了第二個成語。然而,我最終沒有修改主代碼......我想我提出了一個錯誤的問題......不知道評論部分是否是正確的地方要問,但是,如果有很多組織代碼的好方法是什麼系統考慮的變量必須被繪製?也就是說,我正在模擬一個網絡控制系統,並且有許多變量需要繪製。在主腳本中聲明所有用於繪圖的變量看起來非常難看。我認爲通過創建一個類「變量」,我將修剪代碼並將它們的名稱作爲函數,例如變量(state,dynamic,horizo​​n = 2)。 – 605na

+0

將問題重構爲對反饋的響應是​​可以的 - 一直髮生。你可能想看看一些常年蟒蛇的問題,如http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python和http://stackoverflow.com/questions/1849311/how-should-i-organizing-python-source-code您可能還想了解是否可以通過更深層次的層次結構更細緻地細分問題 - 示例中的重複數量表明您所具有的功能可能需要是類實例 – theodox

+0

以及 - pythonland拇指的一個好的規則:代碼是更好的,更短,更具可讀性它。如果代碼看起來很笨重,這是一個重構等待發生:) – theodox

1

Python中的方法是一個函數。如果你想從一個成員函數獲得一個值,你必須用()來結束它。也就是說,一些重構可能有助於消除樣板並減少問題集的大小。我建議使用@property的一些事情,有輕微的重構

class variable: 
    def __init__(self, length): 
    self.length = length # time length` 

@property 
def state_dynamic(self): 
    return self.np_length  
@property 
def state_static(self): 
    return self.np_length 
@property 
def control_dynamic(self): 
    return self.np_length 
@property 
def control_static(self): 
    return self.np_length 
@property 
def scheduling(self): 
    return self.np_length 
@property 
def np_length(self): 
    return np.zeros(2, np.size(self.length)) 

這樣,你可以使用這些功能結合你想你的成員變量之前試過:

var = variable(length).state_dynamic 

我無法從所有這些變量中看出差異是什麼?我沒有看到一個。你是否假設你必須按順序訪問它們?如果是這樣,那就是糟糕的設計和問題。永遠不要做這個假設。

相關問題