在我的項目中,我構建了一個以pandas DataFrame爲核心的類。數據框中的值取決於某些規範,並用一些代表我想要使用的數據的字母初始化它。我把我所有的功能在__init__
裏面創建數據框,據我所知,這個功能只有一個功能,在初始化後它們不需要。另外我不希望在後面的代碼中使用我的類之後訪問此功能。 (我不確定這是否是「pythonic」方式)。創建子類形式類返回熊貓dataFrame
用__str__
和plotData()方法構建基本類後我想應用一些過濾器並構建一個新類,其中附加列是過濾器。我想在__init__
這樣做,但保留所有已完成的工作。也就是說我不想重寫整個__init__
只想添加新的列到基本的數據幀。
以類似的方式,我想在plotData()函數中添加額外的情節
我原來的代碼已經相當的幾行,但原則是非常相似,下面列出代碼。
import pandas as pd
import pylab as pl
class myClass(object):
def __init__(self, frameType = 'All'):
def method1():
myFrame = pd.DataFrame({'c1':[1,2,3],'c2':[4,5,6],'c3':[7,8,9]})
return myFrame
def method2():
myFrame = pd.DataFrame({'c1':[.1,.2,.3],'c2':[.4,.5,.6],'c3':[.7,.8,.9]})
return myFrame
def makingChiose(self):
if self.frameType == 'All':
variable = method1() + method2()
elif self.frameType == 'a':
variable = method1()
elif self.frameType == 'b':
variable = method2()
else:
variable = pd.DataFrame({'c1':[0,0,0],'c2':[0,0,0],'c3':[0,0,0]})
#print 'FROM __init__ : %s' % variable
return variable
self.frameType = frameType
self.cObject = makingChiose(self) # object created by the class
def __str__(self):
return str(self.cObject)
def plotData(self):
self.fig1 = pl.plot(self.cObject['c1'],self.cObject['c2'])
self.fig2 = pl.plot(self.cObject['c1'],self.cObject['c3'])
pl.show()
class myClassAv(myClass):
def addingCol(self):
print 'CURRENT cObject \n%s' % self.cObject # the object is visible
self.cObject['avarage'] = (self.cObject['c1']+self.cObject['c2']+self.cObject['c3'])/3
print 'THIS WORKS IN GENERAL\n%s' % str((self.cObject['c1']+self.cObject['c2']+self.cObject['c3'])/3) # creating new column works
def plotData(self):
# Function to add new plot to already existing plots
self.fig3 = pl.plot(self.cObject['c1'],self.cObject['avarage'])
if __name__ == '__main__':
myObject1 = myClass()
print 'myObject1 =\n%s' % myObject1
myObject1.plotData()
myObject2 = myClass('a')
print 'myObject2 =\n%s' % myObject2
myObject3 = myClass('b')
print 'myObject3 =\n%s' % myObject3
myObject4 = myClass('c')
print 'myObject4 =\n%s' % myObject4
myObject5 = myClassAv('a').addingCol()
print 'myObject5 =\n%s' % myObject5
myObject5.plotData()
大部分代碼的工作,至少在初始化,但我有一個錯誤,當我嘗試創建附加列新的數據幀。當我把新的__init__
放進去時,我創建了一個全新的初始化,並且我放鬆了所有已經完成的工作。我創建了一個新的功能,但我寧願有其他列後,我叫一個新的類不是新類中的函數從代碼的輸出是這樣的:
myObject1 =
c1 c2 c3
0 1.1 4.4 7.7
1 2.2 5.5 8.8
2 3.3 6.6 9.9
myObject2 =
c1 c2 c3
0 1 4 7
1 2 5 8
2 3 6 9
myObject3 =
c1 c2 c3
0 0.1 0.4 0.7
1 0.2 0.5 0.8
2 0.3 0.6 0.9
myObject4 =
c1 c2 c3
0 0 0 0
1 0 0 0
2 0 0 0
CURRENT cObject
c1 c2 c3
0 1 4 7
1 2 5 8
2 3 6 9
THIS WORKS IN GENERAL
0 4
1 5
2 6
myObject5 =
None
Traceback (most recent call last):
File "C:\Users\src\trys.py", line 57, in <module>
myObject5.plotData()
AttributeError: 'NoneType' object has no attribute 'plotData'
的問題是:我可以「部分'重寫超類的方法,使之具有一些新功能的方法之前的內容?我想將myClassAv()初始化爲四個列而不是三個像myClass()的數據框,並且我想讓myClassAv()。plotData()繪製第三行,但保留兩個基類。
我不知道如何解釋一個錯誤,爲什麼myObject5是None,但我懷疑它是繼承的東西。
此外,如果你有建議,我應該以不同的方式做我的想法,我會很高興聽到他們。
謝謝@unutbu,這正是我需要的。如果嵌套方法內的方法是一般的和良好的做法,你會添加一些評論嗎? – tomasz74
首先,我很抱歉這麼晚回覆。我認爲我必須快速關閉標籤頁或某事,因爲當人們給我寫信時,我並不總是看到通知。關於函數的嵌套:如果您認爲函數具有通用性或可重用性,那麼它應該定義在模塊的頂層或其他函數可以調用它的某個地方。如果函數具有非常專用的目的(不可重用),或者如果要保持頂級命名空間整潔,則可以嵌套該函數。 Python的禪說「扁平比嵌套更好」,所以如果有疑問,不要築巢。 – unutbu
嵌套可以用來防止人們調用函數。但是,它不會阻止黑客,因此爲此目的而嵌套的好處可能是可疑的。 – unutbu