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