面向对象的窗体

继承

继承指的是一个对象直接使用另一个对象的属性或方法

继承的格式: class 子类名(父类名): ...

继承定义

# 父类
class Person:

    def __init__(self):
        # 构造,初始化属性
        self.name = 'itcast'
        self.age = 20

    def say_hello(self):
        print('hello {}'.format(self.name))

# 子类
class Student(Person):
    pass


if __name__ == '__main__':
    stu = Student()

    print(stu.name)
    print(stu.age)

    stu.say_hello()

Note

子类继承父类属性和方法

构造函数

# 父类
class Person:

    def __init__(self, name, age):
        # 构造,初始化属性
        self.name = name
        self.age = age

    def say_hello(self):
        print('hello {}'.format(self.name))


# 子类
class Student(Person):
    pass

if __name__ == '__main__':
    stu = Student('itheima', 30)

    print(stu.name)
    print(stu.age)

    stu.say_hello()

Note

父类中如果构造改变,子类实例需要传入对应的参数。

子类覆写构造

# 父类
class Person:

    def __init__(self, name, age):
        # 构造,初始化属性
        self.name = name
        self.age = age

    def say_hello(self):
        print('hello {}'.format(self.name))


# 子类
class Student(Person):

    def __init__(self, name, age, id):
        # 需要去加载父类的构造
        super(Student, self).__init__(name, age)
        self.id = id


if __name__ == '__main__':
    stu = Student('itheima', 30, '110')

    print(stu.name)
    print(stu.age)
    print(stu.id)

    stu.say_hello()

Note

由于业务功能原因,如果子类需要覆写父类的构造,那么:

  • 定义自己的__init__构造函数
  • 在自己的__init__中加载父类的构造,见18行

Qt窗口继承

继承QWidget

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys


class MyWindow(QWidget):

    def __init__(self):
        super(MyWindow, self).__init__()
        self.setWindowTitle('title')


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MyWindow()
    window.show()

    sys.exit(app.exec_())

Note

通过继承QWidget来实现窗体

在构造中,必须实现super函数的调用,否则将出行错误

私有化

在python的类中,通常采用__名称来定义私有化的属性和函数。

私有化变量

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys


class MyWindow(QWidget):

    def __init__(self):
        super(MyWindow, self).__init__()
        self.setWindowTitle('title')

        self.__hello = 'hello'
        self.hi = 'hi'


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MyWindow()
    window.__hello
    window.hi

    window.show()

    sys.exit(app.exec_())

Note

在类中,定义了__hello_hi变量.

在外部使用过程中:

  • 第21行,window.__hello这个访问是不被允许的
  • 第22行,window.hi这个是可以访问的

私有化函数

from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys


class MyWindow(QWidget):

    def __init__(self):
        super(MyWindow, self).__init__()
        self.setWindowTitle('title')
        self.__init_ui()

    def __init_ui(self):
        layout = QHBoxLayout()
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MyWindow()

    window.__init_ui()

    window.show()

    sys.exit(app.exec_())

Note

在类中,定义了__init_ui函数.

  • 第24行,外部调用此函数时,是无法访问的
  • 第12行,内部调用是可以的。

定义原则

  • 当属性只是当前类使用时,就将其作为私有的
  • 当函数只是当前类使用时,就将其作为私有的