python 多态与继承_Python 继承与多态

本文详细介绍了Python中的继承和多态概念。通过实例展示了如何创建基类和子类,以及如何使用`super()`方法调用基类的方法。还讨论了多重继承和方法覆盖,并解释了`isinstance()`函数的用途。
摘要由CSDN通过智能技术生成

# Python 继承与多态

> 原文: [https://thepythonguru.com/python-inheritance-and-polymorphism/](https://thepythonguru.com/python-inheritance-and-polymorphism/)

* * *

于 2020 年 1 月 7 日更新

* * *

继承允许程序员首先创建一个通用类,然后再将其扩展为更专业的类。 它还允许程序员编写更好的代码。

使用继承,您可以继承所有访问数据字段和方法,还可以添加自己的方法和字段,因此继承提供了一种组织代码的方法,而不是从头开始重写代码。

在面向对象的术语中,当`X`类扩展了`Y`类时,则`Y`被称为*超类*或*基类*,而`X`被称为*子类或派生类*。 还有一点要注意,子类只能访问非私有的数据字段和方法,私有数据字段和方法只能在该类内部访问。

创建子类的语法是:

```py

class SubClass(SuperClass):

# data fields

# instance methods

```

让我们以一个例子来说明这一点。

```py

class Vehicle:

def __init__(self, name, color):

self.__name = name      # __name is private to Vehicle class

self.__color = color

def getColor(self):         # getColor() function is accessible to class Car

return self.__color

def setColor(self, color):  # setColor is accessible outside the class

self.__color = color

def getName(self): # getName() is accessible outside the class

return self.__name

class Car(Vehicle):

def __init__(self, name, color, model):

# call parent constructor to set name and color

super().__init__(name, color)

self.__model = model

def getDescription(self):

return self.getName() + self.__model + " in " + self.getColor() + " color"

# in method getDescrition we are able to call getName(), getColor() because they are

# accessible to child class through inheritance

c = Car("Ford Mustang", "red", "GT350")

print(c.getDescription())

print(c.getName()) # car has no method getName() but it is accessible through class Vehicle

```

**预期输出**:

```py

Ford MustangGT350 in red color

Ford Mustang

```

在这里,我们创建了基类`Vehicle`及其子类`Car`。 注意,我们没有在`Car`类中定义`getName()`,但是我们仍然可以访问它,因为类`Car`从`Vehicle`类继承。 在上面的代码中,`super()`方法用于调用基类的方法。 这是`super()`的工作方式

假设您需要在子类的基类中调用名为`get_information()`的方法,则可以使用以下代码进行调用。

```py

super().get_information()

```

同样,您可以使用以下代码从子类构造器中调用基类构造器。

```py

super().__init__()

```

## 多重继承

* * *

与 Java 和 C# 等语言不同,python 允许多重继承,即您可以同时从多个类继承,

```py

class Subclass(SuperClass1, SuperClass2, ...):

# initializer

# methods

```

让我们举个例子:

```py

class MySuperClass1():

def method_super1(self):

print("method_super1 method called")

class MySuperClass2():

def method_super2(self):

print("method_super2 method called")

class ChildClass(MySuperClass1, MySuperClass2):

def child_method(self):

print("child method")

c = ChildClass()

c.method_super1()

c.method_super2()

```

**预期输出**:

```py

method_super1 method called

method_super2 method called

```

如您所见,因为`ChildClass`继承了`MySuperClass1`,`MySuperClass2`,所以`ChildClass`的对象现在可以访问`method_super1()`和`method_super2()`。

## 覆盖方法

* * *

要覆盖基类中的方法,子类需要定义一个具有相同签名的方法。 (即与基类中的方法相同的方法名称和相同数量的参数)。

```py

class A():

def __init__(self):

self.__x = 1

def m1(self):

print("m1 from A")

class B(A):

def __init__(self):

self.__y = 1

def m1(self):

print("m1 from B")

c = B()

c.m1()

```

**预期输出**:

```py

m1 from B

```

在这里,我们从基类中重写`m1()`方法。 尝试在`B`类中注释`m1()`方法,现在将运行`Base`类中的`m1()`方法,即`A`类。

**预期输出**:

```py

m1 from A

```

## `isinstance()`函数

* * *

`isinstance()`函数用于确定对象是否为该类的实例。

**语法**: `isinstance(object, class_type)`

```py

>>> isinstance(1, int)

True

>>> isinstance(1.2, int)

False

>>> isinstance([1,2,3,4], list)

True

```

下一章[异常处理](/python-exception-handling/)。

* * *

* * *

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值