2017-05-18 49 views
1

我有一個名爲DNA的Python對象。我想創建100個DNA實例。每個實例都包含一個對所有實例都相同的熊貓數據框。爲了避免重複,我想將這個數據框作爲一個靜態/類屬性。將熊貓數據框指定爲靜態類變量 - 內存使用(Python)

import pandas as pd 
some_df = pd.DataFrame() 

class DNA(object): 
    df = some_variable # Do i declare here? 

    def __init__(self,df = pd.DataFrame(), name='1'): 
    self.name = name 
    self.instance_df = instance_df # I want to avoid this 
    DNA.some_df = df # Does this duplicate the data for every instance? 

這樣做的正確方法是什麼?

  • 我可以使用init函數來創建類變量嗎?或者它會爲每個類的實例創建一個單獨的類變量?
  • 我需要聲明'class ..'和'def init(...)'之間的類變量嗎?
  • 還有其他的一些方法嗎?

我希望能夠改變我用作類變量的數據框,但是一旦加載了類,就需要在所有實例中引用相同的值(即相同的內存)。

+0

有*在Python *沒有變量聲明,所以目前尚不清楚你至於問什麼你問題的那個方面。這就是說,你可能只是想在這裏指定* df = some_variable#我在這裏聲明嗎?' –

+0

如果我這樣做,我只能構造類,如果我在內存中有'some_variable'。所以,如果我正確理解你,我不能動態地做到這一點...正確嗎? –

+0

當然可以。在你的代碼中的任何地方,你可以做'MyClass.my_class_variable = value' –

回答

2

我已經回答了你的問題的意見:

import pandas as pd 
some_df = pd.DataFrame() 

class DNA(object): 
    df = some_variable # You assign here. I would use `some_df` 

    def __init__(self,df = pd.DataFrame(), name='1'): 
    self.name = name 
    self.instance_df = instance_df # Yes, avoid this 
    DNA.some_df = df # This does not duplicate, assignment **never copies in Python** However, I advise against this 

因此,使用

DNA.some_df = df 

__init__確實工作。由於默認參數僅在函數定義時間處評估一次,所以df總是與df相同,除非您明確地通過了新的 df到__init__,但是這對我來說設計不好。相反,你可能想是這樣的:

class DNA(object): 

    def __init__(self,df = pd.DataFrame(), name='1'): 
    self.name = name 

<some work to construct a dataframe> 
df = final_processing_function() 

DNA.df = df 

假設,那麼你想改變它,在任何時候,你可以使用:

DNA.df = new_df 

注:

In [5]: class A: 
    ...:  pass 
    ...: 

In [6]: a1 = A() 

In [7]: a2 = A() 

In [8]: a3 = A() 

In [9]: A.class_member = 42 

In [10]: a1.class_member 
Out[11]: 42 

In [11]: a2.class_member 
Out[11]: 42 

In [12]: a3.class_member 
Out[12]: 42 

要小心,但是,當你將分配給一個實例時,Python會以你的名字

In [14]: a2.class_member = 'foo' # this shadows the class variable with an instance variable in this instance... 

In [15]: a1.class_member 
Out[15]: 42 

In [16]: a2.class_member # really an instance variable now! 
Out[16]: 'foo' 

,這是通過檢查實例的空間和類對象本身反映:

In [17]: a1.__dict__ 
Out[17]: {} 

In [18]: a2.__dict__ 
Out[18]: {'class_member': 'foo'} 

In [19]: A.__dict__ 
Out[19]: 
mappingproxy({'__dict__': <attribute '__dict__' of 'A' objects>, 
       '__doc__': None, 
       '__module__': '__main__', 
       '__weakref__': <attribute '__weakref__' of 'A' objects>, 
       'class_member': 42}) 
相關問題