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)
现在,name 和 age 都属于 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。