跳到主要内容

类与描述符

常用的类与描述符内置函数:

函数/装饰器说明
property把方法包装成属性访问,可定义 getter / setter / deleter
classmethod类方法,第一个参数是类本身 cls,常用作替代构造器
staticmethod静态方法,不接收 self / cls,相当于放在类里的普通函数
super()在子类中调用父类的方法
object所有类的基类,所有类默认继承它

super:调用父类​

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

class Dog(Animal):
def __init__(self, name):
super().__init__(name) # 调用父类的 __init__

def speak(self):
return f'{self.name} 汪汪叫'

d = Dog('旺财')
print(d.speak()) # 旺财 汪汪叫
print(isinstance(d, Animal)) # True,Dog 是 Animal 的子类

property / classmethod / staticmethod​

class Circle:
pi = 3.14159 # 类属性

def __init__(self, radius):
self._radius = radius

@property
def radius(self):
"""getter:把方法变成属性,访问时不需要括号"""
return self._radius

@radius.setter
def radius(self, value):
"""setter:赋值时自动校验"""
if value <= 0:
raise ValueError('半径必须大于 0')
self._radius = value

@property
def area(self):
return Circle.pi * self._radius ** 2

@classmethod
def from_diameter(cls, diameter):
"""类方法:首参是类本身,常用作替代构造器"""
return cls(diameter / 2)

@staticmethod
def describe():
"""静态方法:不涉及实例和类状态"""
return '这是一个圆'

c = Circle(2)
print(c.radius) # 2,属性方式访问
c.radius = 3 # 触发 setter
print(c.area) # 28.27431
print(Circle.from_diameter(10).radius) # 5.0
print(Circle.describe()) # 这是一个圆