物件屬性的呼叫_PyQt5面向物件程式設計,類和類的繼承
技術標籤:物件屬性的呼叫
“前面的文章講了新建一個面板的程式碼流程,但是它是面向過程的,這種程式設計思路繁瑣且不易移植,而面向物件的程式設計思路就沒有這些問題”
01 面向物件程式設計假設我們想製作幾個面板,每個面板上有很多的控制元件,這是需求
按面向過程的思路,我們先製作一個面板,然後在面板上一個一個地新增控制元件,接著再製作第二個面板,再新增上面的控制元件。。。如果別人想製作其中的某個面板呢?他需要去全部的程式碼裡找到想要的那部分,然後把它複製貼上。。。
按面向物件的思路,我們把每個面板當成是一個物件,而物件是類的例項化,所以我們只需要建立物件的類,實現當對類進行例項化時,能夠自動地把物件的所有屬性和控制元件建立好,然後把這些類寫入一個模組中(python指令碼),當我想製作某個面板時,我只需要匯入模組中相對應的類,然後對類進行例項化,建立物件,不就可以了嘛
由於QWidget是建立視窗的類,我們只需要定義一個類,繼承自父類QWidget,就拿到了QWidget的所有屬性和方法,同時又可以自定義自己的方法和屬性
程式碼如下
02 類from PyQt5.QtWidgets import *import sysclass Window(QWidget): def __init__(self): super().__init__() #呼叫父類的init方法 self.setWindowTitle("主面板") #面板屬性 self.resize(500, 500) #面板屬性 self.Setup_UI(); #面板上的控制元件都寫在了這個方法內 def Setup_UI(self): button = QPushButton(self) button.resize(40, 40) button.setText("按鈕") button.move(100, 100) label = QLabel(self) label.resize(40, 40) label.setText("文字") label.move(100, 200)if __name__ == "__main__": app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
類用關鍵字class定義,名稱第一個字母大寫,後面接中括號(),裡面可以寫入繼承自哪個父類。如果沒有父類,中括號也可以省略
類中可以定義方法和屬性,其中__init__()方法是在建立類的物件時會自動執行的,方法後面的中括號()內定義需要傳入的引數
C#區分靜態類和非靜態類,python沒有靜態類和非靜態類之分
C#的類中有靜態方法和非靜態方法之分,用關鍵字static定義,而python中非靜態方法傳入的第一個引數是self,self表示類的例項化物件,表示只有物件能呼叫,呼叫時用:物件名.方法(引數1,引數2...);靜態方法定義時傳入的引數沒有self,表示不能用類的物件呼叫,直接類名呼叫,同時需要在方法前一行加上關鍵字@staticmethod,來表示這是一個靜態方法,通常用在工具類裡
init方法是在建立類的物件時會自動呼叫的,可以利用這個特點在建立物件時,自動實現想要的功能,比如說建立物件的屬性或呼叫某些方法實現某些功能
class Animal(): def __init__(self, age, mile):self.age=age#物件屬性 self.Run(mile) #非靜態方法呼叫:物件名.方法名(引數) def Run(self, mile): print("動物跑了%d米" % mile)animal = Animal(5, 10) #由於__init__()方法裡傳入引數age,所以在建立物件是也需要傳入age的實參print("動物的年齡是%d歲" % animal.age)animal.Run(10)
如果init方法中傳入了行參,那麼例項化物件時由於會自動呼叫init方法,所以在建立類的物件時必須傳入實參
靜態方法
class Animal(): def __init__(self, age):self.age=age#物件屬性 @staticmethod def Run(mile): print("動物跑了%d米" % mile)Animal.Run(10)
用關鍵字@staticmethod表示,傳入的形參中沒有self,表示不能用類的物件呼叫,需要用類名呼叫
03
類的繼承
類在定義時,如果有父類,可以定義繼承的父類,子類預設繼承父類的所有的方法和屬性,但,如果子類裡有同樣的方法名和屬性名,會優先呼叫自己的
子類如果沒有init方法,可以繼承父類的init方法class Animal(): def __init__(self, age): self.age = age #物件屬性class Dog(Animal): passdog = Dog(5)print(dog.age)
子類如果有init方法,不會再呼叫父類的init方法
class Animal(): def __init__(self, age): self.age = ageclass Dog(Animal): def __init__(self): passdog = Dog()print(dog.age)
會發現報錯了,dog物件沒有age這個屬性,說明建立dog物件時不會呼叫父類的init方法,也就不會有age這個屬性
子類如果既想呼叫自己的init方法,又想呼叫父類的init方法class Animal(): def __init__(self, age): self.age = ageclass Dog(Animal): def __init__(self, age): super().__init__(age)dog = Dog(5)print(dog.age)
可以在子類的init方法裡執行父類的init方法,super().__init__()
子類可以繼承父類的屬性class Animal(): age = 5class Dog(Animal): def __init__(self): passdog = Dog()print(dog.age)
子類如果有相同的屬性,只會呼叫自己的屬性
class Animal(): age = 5class Dog(Animal): age = 10dog = Dog()print(dog.age)
子類可以呼叫父類的方法
class Animal(): def Run(self, mile): print("動物跑了%d米" % mile)class Dog(Animal): passdog = Dog()dog.Run(10)
子類如果有相同的方法,只會呼叫自己的方法
class Animal(): def Run(self, mile): print("動物跑了%d米" % mile)class Dog(Animal): def Run(self, mile): print("狗跑了%d米" % mile)dog = Dog()dog.Run(10)
所以,如果一個類呼叫方法或屬性,優先在自己的類中呼叫,如果沒有,才會去父類中呼叫,如果再沒有,再去父類的父類,基類中呼叫
如果覺得文章不錯,記得在下方 分享 收藏 點贊 在看 四連擊