类方法
概念解释
类方法是定义在类上的方法,可以通过类名或类的实例来调用。类方法使用 @classmethod
装饰器来定义,其第一个参数通常是 cls
,表示类本身。类方法可以访问和修改类变量,但不能访问实例变量。
语法
class MyClass:
@classmethod
def my_class_method(cls, arg1, arg2, ...):
# 方法体
特点
- 通过类名或实例调用:类方法可以通过类名或类的实例来调用。
- 第一个参数是类本身:类方法的第一个参数通常是
cls
,表示类本身。 - 不能访问实例变量:类方法不能访问实例变量,但可以访问和修改类变量。
示例
class Student:
school_name = "ABC School" # 类变量
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age # 实例变量
@classmethod
def change_school_name(cls, new_name):
cls.school_name = new_name
# 通过类名调用类方法
Student.change_school_name("XYZ School")
print(Student.school_name) # 输出: XYZ School
# 通过实例调用类方法
student1 = Student("Alice", 20)
student1.change_school_name("123 School")
print(Student.school_name) # 输出: 123 School
类变量
概念解释
类变量是定义在类中但在方法之外的变量。类变量是所有实例共享的,可以通过类名或实例来访问和修改。类变量的值在所有实例中是相同的,除非在实例中被显式修改。
语法
class MyClass:
class_variable = value
特点
- 共享性:类变量是所有实例共享的,所有实例访问的是同一个变量。
- 通过类名或实例访问:类变量可以通过类名或实例来访问和修改。
- 优先级:实例变量的优先级高于类变量,如果实例中定义了同名的实例变量,则实例变量会覆盖类变量。
示例
class Student:
school_name = "ABC School" # 类变量
def __init__(self, name, age):
self.name = name # 实例变量
self.age = age # 实例变量
# 通过类名访问类变量
print(Student.school_name) # 输出: ABC School
# 通过实例访问类变量
student1 = Student("Alice", 20)
print(student1.school_name) # 输出: ABC School
# 修改类变量
Student.school_name = "XYZ School"
print(Student.school_name) # 输出: XYZ School
print(student1.school_name) # 输出: XYZ School
# 实例中定义同名的实例变量
student1.school_name = "123 School"
print(student1.school_name) # 输出: 123 School
print(Student.school_name) # 输出: XYZ School
综合示例
下面是一个综合示例,展示了类方法和类变量的使用:
class Circle:
pi = 3.14159 # 类变量
def __init__(self, radius):
self.radius = radius # 实例变量
@classmethod
def change_pi(cls, new_pi):
cls.pi = new_pi
def area(self):
return self.pi * self.radius ** 2
# 创建实例
circle1 = Circle(5)
circle2 = Circle(10)
# 计算面积
print(circle1.area()) # 输出: 78.53975
print(circle2.area()) # 输出: 314.159
# 修改类变量
Circle.change_pi(3.14)
# 重新计算面积
print(circle1.area()) # 输出: 78.5
print(circle2.area()) # 输出: 314.0
在这个示例中,我们定义了一个 Circle
类,其中 pi
是类变量,radius
是实例变量。我们通过类方法 change_pi
来修改类变量 pi
,并通过实例方法 area
来计算圆的面积。
总结
类方法和类变量是Python中面向对象编程的重要概念。类方法可以通过类名或实例调用,用于操作类变量或执行与类相关的操作。类变量是所有实例共享的变量,可以通过类名或实例访问和修改。