Python中类(静态)变量和方法的创建

Python中类(静态)变量和方法的创建

技术背景

在Python中,虽然没有像C++和Java那样明确的static关键字,但仍然可以实现类(静态)变量和方法。理解如何创建和使用这些特性,对于编写高效、可维护的Python代码至关重要。

实现步骤

类(静态)变量

在Python中,变量声明在类定义内部,但不在任何方法内部,即为类(静态)变量。示例如下:

1
2
3
4
class MyClass:
i = 3

print(MyClass.i) # 输出: 3

需要注意的是,类变量和实例变量是不同的。如果对实例的同名变量进行赋值,不会改变类变量的值:

1
2
3
m = MyClass()
m.i = 4
print(MyClass.i, m.i) # 输出: 3 4

静态方法

可以使用@staticmethod装饰器来定义静态方法。静态方法不需要访问类或实例的属性和方法,因此没有默认的第一个参数。示例如下:

1
2
3
4
5
6
7
class C:
@staticmethod
def f(arg1, arg2):
return arg1 + arg2

result = C.f(1, 2)
print(result) # 输出: 3

类方法

使用@classmethod装饰器来定义类方法。类方法的第一个参数是类对象本身,通常命名为cls。示例如下:

1
2
3
4
5
6
7
8
9
class Test:
i = 3
@classmethod
def g(cls, arg):
if arg > cls.i:
cls.i = arg

Test.g(5)
print(Test.i) # 输出: 5

核心代码

以下是一个包含类变量、静态方法和类方法的完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Calculator:
num = 0

def __init__(self, digits):
Calculator.num = int(''.join(map(str, digits)))

@staticmethod
def multiply(n1, n2, *args):
res = 1
for num in args:
res *= num
return n1 * n2 * res

@classmethod
def get_digits(cls, num):
digits = list(str(num))
calc = cls(digits)
return calc.num

print(Calculator.multiply(1, 2, 3, 4)) # 输出: 24
print(Calculator.get_digits(314159)) # 输出: 314159

最佳实践

  • 使用类方法替代静态方法:当需要访问类的属性或方法时,优先使用类方法,因为它可以接收类对象作为第一个参数。
  • 使用属性来模拟静态变量:为了确保类变量在所有实例之间保持同步,可以将类变量转换为属性。示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Test:
_i = 3

@property
def i(self):
return type(self)._i

@i.setter
def i(self, val):
type(self)._i = val

x1 = Test()
x2 = Test()
x1.i = 50
print(x2.i) # 输出: 50

常见问题

类变量和实例变量的混淆

当对实例的同名变量进行赋值时,会创建一个新的实例变量,而不是改变类变量的值。例如:

1
2
3
4
5
6
class Test:
i = 3

t = Test()
t.i = 5
print(Test.i, t.i) # 输出: 3 5

静态方法和类方法的误用

静态方法不能访问类或实例的属性和方法,而类方法可以。如果需要访问类的属性或方法,应该使用类方法而不是静态方法。

子类对类变量的影响

子类可以继承和修改父类的类变量。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A:
static = 1

class B(A):
pass

print(A.static) # 输出: 1
print(B.static) # 输出: 1

A.static = 5
print(A.static) # 输出: 5
print(B.static) # 输出: 5

B.static = 6
print(A.static) # 输出: 5
print(B.static) # 输出: 6

Python中类(静态)变量和方法的创建
https://119291.xyz/posts/2025-04-14.python-class-static-variables-and-methods/
作者
ww
发布于
2025年4月14日
许可协议