函数签名; 类与实例属性; 类与实例方法; 元组¶
2025.6.29
函数签名语法¶
中括号相关¶
collections 是 Python 官方提供的常见数据容器库,内含双端队列 deque 。相关文档可以看 Python 的官方网站。
以双端队列为例,这玩意是这样一个类:
这里的函数签名语法 [iterable[, maxlen]] 值得学习:
函数签名=参数个数+参数类型+返回值
一言以蔽之,中括号表示里面的参数可以不给。比如,以下都是合法的初始化:
buffer = collections.deque()
buffer = collections.deque([1,2,3])
buffer = collections.deque([1,2,3],5)
[, maxlen] 表示第二个参数 maxlen 可以不给,但如果想按位置传参 maxlen ,必须先给定第一个参数 iterable 。
除非,如下按关键字传参
星号相关¶
Python 官方提供的 random 库里有这样一个函数
这里的 * 是用于分隔 位置参数 和 关键字-only参数 的。
首先,这个函数一共有三个参数,分别是 population, k 和 counts ,其中, population 和 k 是位置参数,也就是说,它们既可以按位置传,也可以按关键字传;而 * 后的所有参数(此处是 counts )都是关键字参数,也就是说,它们只能按关键字传参。
类属性与实例属性¶
Python 里的类和 C++ 里的不一样,C++ 里的类只是一个类型,而 Python 里的类是一个独立的对象。
class MyClass:
# —— 这是一个类属性
species = "Homo sapiens"
def __init__(self, name):
# —— 这是一个实例属性
self.name = name
类属性直接在类的顶层作用域中定义,属于类本身;实例属性通常在类的 __init__ 函数(或其它实例函数)中以 self.xxx = ... 的形式定义,属于特定实例。
类属性保存在类的 __dict__ 中,而实例属性保存在实例的 __dict__ 中。
>>> MyClass.__dict__['species']
'Homo sapiens'
>>> obj = MyClass("Alice")
>>> obj.__dict__['name']
'Alice'
类方法,实例方法与静态方法¶
如下所示:
class MyClass:
counter = 0
def __init__(self, value):
self.value = value
MyClass.counter += 1
def instance_method(self, increment):
self.value += increment
print(f"当前 value={self.value}")
@classmethod
def class_method(cls):
print(f"当前已有 {cls.counter} 个实例")
@staticmethod
def add(a, b):
print(f"{a} + {b} = {a+b}")
# 使用
obj = MyClass(10)
obj.instance_method(5) # 输出:当前 value=15
ins = MyClass(11)
ins.class_method() # 输出:当前已有 2 个实例
ins.add(1,1) # 输出:1 + 1 = 2
实例方法默认第一个参数为 self ,代表调用该方法的实例对象。也就是说,obj.instance_method(5) 等价于 MyClass.instance_method(obj, 5) 。
类方法用 @classmethod 在定义处修饰,默认第一个参数为 cls ,代表调用该方法的类。
静态方法用 @staticmethod 在定义处修饰,用法和普通函数完全一致,不接受 self 和 cls 参数。
元组 tuple¶
元组 tuple 是 Python 内建的序列类型之一,用于存储有序、不可变(immutable)的元素集合。