对象属性的调用_PyQt5面向对象编程,类和类的继承
“前面的文章講了新建一個面板的代碼流程,但是它是面向過程的,這種編程思路繁瑣且不易移植,而面向對象的編程思路就沒有這些問題”
01面向對象編程假設我們想制作幾個面板,每個面板上有很多的控件,這是需求
按面向過程的思路,我們先制作一個面板,然后在面板上一個一個地添加控件,接著再制作第二個面板,再添加上面的控件。。。如果別人想制作其中的某個面板呢?他需要去全部的代碼里找到想要的那部分,然后把它復制粘貼。。。
按面向對象的思路,我們把每個面板當成是一個對象,而對象是類的實例化,所以我們只需要創建對象的類,實現當對類進行實例化時,能夠自動地把對象的所有屬性和控件創建好,然后把這些類寫入一個模塊中(python腳本),當我想制作某個面板時,我只需要導入模塊中相對應的類,然后對類進行實例化,創建對象,不就可以了嘛
由于QWidget是創建窗口的類,我們只需要定義一個類,繼承自父類QWidget,就拿到了QWidget的所有屬性和方法,同時又可以自定義自己的方法和屬性
代碼如下
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_())02類類用關鍵字class定義,名稱第一個字母大寫,后面接中括號(),里面可以寫入繼承自哪個父類。如果沒有父類,中括號也可以省略
類中可以定義方法和屬性,其中__init__()方法是在創建類的對象時會自動執行的,方法后面的中括號()內定義需要傳入的參數
C#區分靜態類和非靜態類,python沒有靜態類和非靜態類之分
C#的類中有靜態方法和非靜態方法之分,用關鍵字static定義,而python中非靜態方法傳入的第一個參數是self,self表示類的實例化對象,表示只有對象能調用,調用時用:對象名.方法(參數1,參數2...);靜態方法定義時傳入的參數沒有self,表示不能用類的對象調用,直接類名調用,同時需要在方法前一行加上關鍵字@staticmethod,來表示這是一個靜態方法,通常用在工具類里
__init__()方法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)所以,如果一個類調用方法或屬性,優先在自己的類中調用,如果沒有,才會去父類中調用,如果再沒有,再去父類的父類,基類中調用
如果覺得文章不錯,記得在下方 分享 收藏 點贊 在看 四連擊
總結
以上是生活随笔為你收集整理的对象属性的调用_PyQt5面向对象编程,类和类的继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串删除首尾_[LeetCode] 4
- 下一篇: hαbits的意思_hαppy什么么意思