跳到主要内容

Python 的类

在 Python 中,class 用来定义一种“类型”。 它本身不是具体的东西,而是一个模板

例如:

class Dog:  
pass

这一行代码的含义只有一句话:

我定义了一种新的类型,名字叫 Dog

但此时还没有真正的“狗”。 只有当我们创建对象时,才会产生一个具体实例:

d = Dog()

Dog 是类型(模板), d 是对象(实例)。类的作用,是把数据和行为放在一起。如果不用类,数据可能是分散的:

name = "旺财"  
age = 3

它们彼此没有归属关系。而使用类:

class Dog:  
def __init__(self, name, age):
self.name = name
self.age = age

d = Dog("旺财", 3)

现在,nameage 都属于 d 这个对象。 数据被组织在一起,形成一个整体。

在 ROS 中也是一样。当看到:

class SimpleNode(Node):  
...

意思只是: 我定义了一种新的节点类型。当你写:

node = SimpleNode()

你才真正创建了一个节点对象。

可以用一句话总结:类是创建对象的模板; 对象是类的具体实例。理解这一点,就理解了 Python 面向对象的起点。

Python 中的继承

继承的作用只有一个:让一个类拥有另一个类的能力。语法非常简单:

class 子类(父类):  
...

一个最简单的例子

先定义一个父类:

class Animal:  
def eat(self):
print("正在吃东西")

再定义一个子类:

class Dog(Animal):  
pass

现在创建对象:

d = Dog()  
d.eat()

虽然 Dog 没有写 eat(), 但它可以使用 eat()。原因是:Dog 继承了 Animal。

子类可以扩展功能

class Dog(Animal):  

def bark(self):
print("汪汪叫")

现在:

d = Dog()  
d.eat() # 来自父类
d.bark() # 自己的

子类可以:

  • 使用父类的方法

  • 添加自己的方法

子类的构造函数

如果父类有 __init__,子类通常要调用它。

class Animal:  
def __init__(self, name):
self.name = name

class Dog(Animal):
def __init__(self, name, age):
super().__init__(name)
self.age = age

关键点:

super().__init__(name)

意思是:

调用父类的构造函数。如果不调用,父类的初始化可能不会执行。

ROS 中的继承

你会看到这样的代码:

class SimpleNode(Node):

意思是:SimpleNode 继承了 Node。

因此它自动拥有:

  • create_publisher()
  • create_timer()
  • get_logger()

这些功能来自父类 Node。如果没有继承,你就无法使用这些方法。

一句话总结

继承的本质是: 子类自动拥有父类的能力,并可以增加自己的功能。在 ROS 中:节点类,本质上都是继承自 Node。