1. 程式人生 > 其它 >物件屬性的呼叫_PyQt5面向物件程式設計,類和類的繼承

物件屬性的呼叫_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這個屬性

1afa507c74dcafbb33647204331b44f8.png

子類如果既想呼叫自己的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)

所以,如果一個類呼叫方法或屬性,優先在自己的類中呼叫,如果沒有,才會去父類中呼叫,如果再沒有,再去父類的父類,基類中呼叫

如果覺得文章不錯,記得在下方 分享 收藏 點贊 在看 四連擊38e74be6e41a524144ab339103848169.gif