优秀的编程知识分享平台

网站首页 > 技术文章 正文

Python类继承的详细指南

nanyue 2025-03-03 19:33:42 技术文章 7 ℃

在没学习 Python之前,我们经常听说它是面向对象的,他是怎么体现的呢?要想学好python这个技术,掌握类的建立和使用肯定是学好python的关键之一。

我们先看看怎么建立类,知道怎么建,才好去用吧。

class MyClass:

pass

我们看到class 打头,这是不是和其他的编程语言有相似的地方,不过这里不用{}号哦,不过它对齐有严格的规定要求。

上面我们建立了一个MyClass一个新类,那么我们怎么使用呢?

如下:

obj = MyClass()#在类的后面加上括号,这样我们就实例化了

我们学会了创建类,在生活中,发现很多有共同的东西,比如猫,狗、牛都能叫,眼睛、鼻子等等。我们是不是可以不一一创建,我们是不是可以设置一个类,然后其他的类稍微修改下,比如牛的叫声和猫的不一样,但都是叫。这里就是我们说的继承。

那么新的类怎么写呢:

class SubClass(MyClass):

pass

我们把MyClass放到新类的后面用括号包起来,SubClass就继承了它。

你说是,我怎么知道就继承了呢。

我们可以用这个isinstance()函数来判断下是否属于某个类或其子类

obj = SubClass()

if isinstance(obj, MyClass):

print("该对象是MyClass的子类")


我们通过IF来判断了下,上图看,很明显我们是创建没有任何问题,确实是myclass的子类。

那也有脑子转的快的同学,那创建一个大象,大象用鸡的眼睛、用狗的叫声、猴子的尾巴是不是也行...

当然可以,这么一来就要同时继承多个了,在编程世界里,这就叫多重继承。

要这么实现呢,我们可以括号中写上所有的你想要继承的类,记得要逗号分开,不能它认不出来的哦。

这样:

class Derived(Base1, Base2):

pass


同时继承了base1 和2。

我们通过上面,我们很快就知道了怎么创建,和应用的。但是这些太简单了,没有什么功能,

我们接下来就了解一下类里面是怎么实现我们的想要完成的事的。

下面用这个 __init__()方法,初始化对象属性:

class Vehicle:

def __init__(self, name):#初始

self.name = name#动作1

class Car(Vehicle):#这个类没设置什么功能

pass

car = Car("宝马")#我调用car这个类

print(car.name) # 神奇的事输出"宝马",这个是Vehicle干的活



有些厉害的朋友、同学,我感觉这个类功能还达不到我的想要的,我还有其他的想法,能不能加进去。

当然可以,你可能比你的父母多学了一门技能,因为他们花前供我们读书学本身了,那你就开始重写基类。

那怎么去重写呢

子类可以选择重写基类的方法。例如,覆盖move()方法:

class Vehicle:

def move(self):

print(f"{self.name}正在移动。")

class Car(Vehicle):

def __init__(self, type):

self.type=type

super().__init__()

def move(self):

print(f"{self.type}正在快速移动。")

car = Car("宝马")

car.move() # 输出"宝马正在快速移动。"



我们看到子类和父类 ,输出有点不一样。一个只是告诉在移动,在子类中是快速移动


到现在很多人就会产生疑问了,这是我自己写的方法,那别人写的方法,我怎么知道什么功能,我不能乱调用。

那么我们只要掌握怎么去查看方法有什么属性

使用dir()来

car = Car("宝马")

print(dir(car)) # 列出car对象的属性,包括继承自Vehicle和Car中的内容。



一些特殊方法的使用:

定义__str__()或__repr__()方法,在打印时显示友好的信息

class Example:

def __init__(self, description):

self.description = description

def __str__(self):

return f"This is an example: {self.description}"

obj = Example("示例")

print(obj) # 输出"This is an example: 示例"

我们访问的时候,通过使用private和protected属性(前缀 _ 表示)加了就受保护了,只能类中、子类访问了。不加就是public类外都可以访问。

class Example:

def __init__(self):

self._data = 42

obj = Example()

print(obj._data) # 输出42

如果一个分类和另一个基类有相同的方法名,子类继承时可能会出现冲突。可以我们可以重写或保留其中一个:如果不做什么,那就优先使用第一个父类的方法。

class Base1:

def do_something(self):

print("Base1中的方法被调用。")

class Base2:

def do_something(self):

print("Base2中的方法被调用。")

class Derived(Base1, Base2):

pass

obj = Derived()

obj.do_something() # 输出"Base1中的方法被调用。"(由于优先考虑最后继承的类)



通过以上内容,你是不是已经理解了雷达继承,那就开始吧。

最近发表
标签列表