簡短的回答:
不,你沒有定義屏幕時使用超。是的,你總是必須__init__
超級(如果你使用__init__
)。
較長的答案:
沒什麼獨特的屏幕。在文檔示例中,您不會調用__init__
並傳遞任何參數,因此不需要super
。您不需要撥打__init__
來定義Kivy屏幕。從SO問題來看,如果你正在運行__init__
,你將** kwargs傳遞給對象層次結構,並重新定義__init__
,這通常會運行父類的初始化。 super
用於允許您傳遞** kwargs並運行父代__init__
而不顯式調用父類,在這種情況下,Screen
繼承自RelativeLayout
,它本身繼承自FloatLayout
;如果沒有超級召喚,你會覆蓋父類。
除非您有一些使用它,否則不需要致電__init__
。下面是從我的應用程序之一Screen
,沒有__init__
調用(佈局設置在.kv文件):
class LoginScreen(Screen):
def login(self):
self.parent.current = 'ParameterScreen'
您將使用__init__
如果要設置佈局,內容,性質等。當你實例化你創建的類而沒有在.kv文件中定義這些東西的時候,要做到這一點,你還需要如上所述的超級。儘管在可以的時候使用.kv文件,但在kivy中是一個很好的練習。
在這個例子中,我希望能夠通過self.caller訪問BottomBar的父項,我在創建它時將它作爲** kwargs傳入,並且在實例化該欄時立即定義它;所以我需要定義它在__init__
這需要超級電話。
class BottomBar(ActionBar):
titletext = StringProperty('')
def __init__(self,**kwargs):
self.caller = kwargs.get('caller')
super(BottomBar,self).__init__(**kwargs)
def change_title(self,newtitle):
self.titletext = newtitle
這是否意味着,如果我沒有超級繼承就像這個例子:https://github.com/kivy/kivy/wiki/Data-driven-variables-with-kivy-properties,我可以修改根部件類和訪問變量,這些變量可能在執行期間在根部件中生成(例如,從管道對象中獲取變量)? – Moritz
@Moritz如果你正在使用__init__,你正在覆蓋默認的初始化,它會調用父類的__init__,等等。你需要一個超級調用或一個明確命名的BaseClass .__ init __()。超級可以將參數傳遞給父類。 – Daniel