学习基本的Python继承的例子

217 阅读3分钟

面向对象编程的一个关键概念是继承。在本教程中,我们将看到基本的继承在 Python 中是如何工作的。继承定义了一个给定的类从一个或多个基类继承属性和方法(变量和函数)的方法。这种技术使程序员有能力将共同的功能和数据集中在一个地方,而不是让它分散在多个类中重复使用。现在让我们看一下Python中继承的几个例子。


一个Python类

class Superclass():
    def __init__(self, color, height, width):
        self.height = height
        self.color = color
        self.width = width

    def does_stuff(self):
        print('This method does stuff')

上面是一个简单的Python类。它有三个属性和一个方法。


继承自一个超类

class Subclass(Superclass):
    pass


obj1 = Subclass('Red', '5 feet', 100)

在这段代码中,我们定义了一个新的 Subclass 类,并使其继承于 Superclass。我们在这个 Subclass 中使用 pass 关键字来表明它没有自己的数据或行为。然后我们从这个Subclass中创建一个对象,并将其分配给obj1。


子类现在拥有继承的属性和方法

print(type(obj1))
print(isinstance(obj1, Subclass))
print(obj1.color)
print(obj1.height)
print(obj1.width)
obj1.does_stuff()
<class '__main__.Subclass'>
True
Red
5 feet
100
This method does stuff

这段代码的作用是使用[type()和isinstance()]来表明obj1是一个Subclass类型的对象。此外,由于它继承了Superclass,它可以访问父类的所有属性和方法。


没有继承性的类

class Inputdevice:
    def __init__(self, devicetype, inputconnector, bluetooth, manufacturer):
        self.devicetype = devicetype
        self.manufacturer = manufacturer
        self.inputconnector = inputconnector
        self.bluetooth = bluetooth


class Outputdevice:
    def __init__(self, devicetype, connector, manufacturer, outrate):
        self.devicetype = devicetype
        self.manufacturer = manufacturer
        self.outrate = outrate
        self.connector = connector


class IODevice:
    def __init__(self, devicetype, connector, manufacturer, outrate):
        self.devicetype = devicetype
        self.manufacturer = manufacturer
        self.outrate = outrate
        self.connector = connector


input1 = Inputdevice("Keyboard", "usb", True, "Lenovo")
io1 = IODevice("Flash Drive", "usb", "Sandisk", "35MB ps")
output1 = Outputdevice("Monitor", "HDMI", "Samsung", "18Gbps")

print("This device has a " + input1.inputconnector + " connector")
print(io1.manufacturer + " is the device manufacturer")
print(input1.manufacturer + " " + input1.devicetype)
print(output1.manufacturer + " " + output1.devicetype)
This device has a usb connector
Sandisk is the device manufacturer
Lenovo Keyboard
Samsung Monitor

在这段代码中,你可以看到有三个类。有一个Inputdevice、Outputdevice和IOdevice类。这些类中的每一个都代表一种类型的外围设备,每一个都有一组与该外围设备类型相关的属性。所以Inputdevice有一个devicetype和一个制造商,以及一个inputconnector和使用蓝牙的能力。一个IOdevice也有一个devicetype和一个制造商,但他们有一个通用连接器,而不是一个inputconnector。Outputdevice也有一个devicetype制造商,同时也有一个outrate和一个连接器。运行代码的输出给了我们期望看到的东西。在这种状态下,每一个都是它自己的类的独立实现,但每个类所持有的数据之间有相当多的重复。我们可以用继承来做得更好。


用继承重写类

class Peripheral:
    def __init__(self, devicetype, manufacturer):
        self.devicetype = devicetype
        self.manufacturer = manufacturer


class Outputperipheral(Peripheral):
    def __init__(self, devicetype, manufacturer, connector, outrate):
        super().__init__(devicetype, manufacturer)
        self.outrate = outrate
        self.connector = connector


class Inputdevice(Peripheral):
    def __init__(self, devicetype, inputconnector, bluetooth, manufacturer):
        super().__init__(devicetype, manufacturer)
        self.inputconnector = inputconnector
        self.bluetooth = bluetooth


class Outputdevice(Outputperipheral):
    def __init__(self, devicetype, connector, manufacturer, outrate):
        super().__init__(devicetype, manufacturer, connector, outrate)


class IODevice(Outputperipheral):
    def __init__(self, devicetype, connector, manufacturer, outrate):
        super().__init__(devicetype, manufacturer, connector, outrate)


input1 = Inputdevice("Keyboard", "usb", True, "Lenovo")
io1 = IODevice("Flash Drive", "usb", "Sandisk", "35MB ps")
output1 = Outputdevice("Monitor", "HDMI", "Samsung", "18Gbps")

print("This device has a " + input1.inputconnector + " connector")
print(io1.manufacturer + " is the device manufacturer")
print(input1.manufacturer + " " + input1.devicetype)
print(output1.manufacturer + " " + output1.devicetype)
This device has a usb connector
Sandisk is the device manufacturer
Lenovo Keyboard
Samsung Monitor

原来的代码现在被重写,以利用继承性。我们对这些类进行了更好的组织,并通过实现一些继承和类的层次结构,使引入新的类变得更加容易。运行这段新的代码,你可以看到输出结果和以前一样。所以我们得到了同样的结果,但有了更好的代码组织,这也是继承的主要好处之一。我们现在可以在一个地方添加每种外设所特有的属性,如果我们将来需要改变这些属性的名称,也只能在一个地方编辑它们。