Python面向对象编程详解
Python是一种面向对象的编程语言,面向对象的编程方法涉及很多概念和技巧,其中两个重要的知识点包括:类方法与静态方法如何通过面向对象的方式解决实际问题。以下是对这些知识点的详细讲解。
1. 类方法与静态方法
1.1 类方法 (@classmethod
)
- 类方法是属于类而非实例的方法。它们的第一个参数是类本身,而不是类的实例。
- 通常使用
@classmethod
装饰器来标记类方法。 - 类方法常用于需要访问类属性或类方法的场景,而不需要实例化对象。
类方法通过装饰器 @classmethod
来定义,格式如下:
语法:
python
@classmethod
def 方法名(cls) :
方法代码
@classmethod
必须位于方法(函数)上面一行
使用示例:
python
class Student:
company = "类属性" # 类属性
@classmethod
def printCompany(cls):
print(cls.company) #可以通过cls关键字取调用类属性
Student.printCompany() #可以直接使用类名取调用方法
print(Student.company) #不需要实例化就可以访问类属性
输出:
类属性
类属性
解释:在上面的例子中:
cls
:指的就是"类对象"本身Student.printCompany()
因为使用了@classmethod
声明他是类方法;可以直接通过类调用,无需实例化
和普通调用类方法有什么区别?
特性 | 普通方法 | 类方法 |
---|---|---|
访问属性 | 通过实例 (self ) 访问类属性和实例属性 |
通过类 (cls ) 访问类属性 |
第一个参数 | self (实例对象) |
cls (类本身) |
访问实例属性 | 可以访问实例属性和类属性 | 只能访问类属性,不能访问实例属性 |
调用方式 | 需要先创建实例,然后通过实例调用 | 可以直接通过类调用,无需实例化 |
使用场景 | 适用于需要依赖实例的属性或方法 | 适用于需要访问类级别的属性或方法 |
示例代码
- 以前访问类属性或者方法(
需要创建一个实例对象
):
python
class Student:
company = "类属性" # 类属性
def printCompany(self):
print(Student.company) #可以通过类调用类属性
s1=Student() #实例化对象
s1.printCompany() #通过对象调用方法
print(s1.company) #通过对象调用属性
- 现在通过类方法访问类属性或者方法(
不需要创建实例即可访问
):
python
class Student:
company = "类属性" # 类属性
@classmethod
def printCompany(cls):
print(cls.company) #可以通过cls关键字取调用类属性
Student.printCompany() #可以直接使用类名取调用方法
print(Student.company) #不需要实例化就可以访问类属性
1.2 静态方法 (@staticmethod
)
静态方法是属于类,但它不需要访问类或实例的任何属性或方法。它通常用于一些与类相关,但又不依赖于类或实例的功能。静态方法使用 @staticmethod
装饰器。
可理解为:静态方法就像是定义在类外面的普通函数,只不过它是作为类的一部分存在的
语法:
python
@staticmethod
def 方法名(cls) :
方法代码
使用示例:
python
class Student:
company = "SXT" # 类属性
@staticmethod #声明为静态方法
def add(a, b): # 静态方法
print(a+b)
return a + b
Student.add(20, 30) #可以通过类名直接调用方法,实例方法不可以
add
是静态方法,它没有cls
或self
参数,仅依赖传入的参数进行计算
输出:
50
1.3 类方法与静态方法的区别
特性 | 类方法 (@classmethod ) |
静态方法 (@staticmethod ) |
---|---|---|
第一个参数 | cls ,表示类本身 |
没有 cls 或 self ,不与类或实例绑定 |
访问类属性和实例属性 | 可以通过 cls 访问类属性,不能访问实例属性 |
不能访问类属性或实例属性(能访问,但不推荐) |
目的 | 处理与类相关的操作,修改类的状态(类属性) | 不依赖类或实例,通常用于实现与类逻辑相关但独立的功能 |
调用方式 | 可以通过类名或实例调用 | 可以通过类名或实例调用 |
用途 | 常用于操作类属性或进行类级别的逻辑 | 常用于实现与类相关但不依赖类状态的功能 |
示例 | @classmethod def method(cls): ... |
@staticmethod def method(a, b): ... |
- 类方法:访问类的属性和方法,并且第一个参数是类本身。
- 静态方法:不访问类或实例的任何属性或方法,完全独立。
2. 综合案例:使用类方法、静态方法
现在,我们结合类方法、静态方法,编写一个简单的案例,学生管理系统。
2.1 学生管理系统
我们设计一个学生类作为基类,包含类方法和静态方法
python
class Student:
company = "ClassAttribute" # 类属性
@classmethod # 类方法,适合访问类属性
def printCompany(cls):
print(f"类方法调用的类属性为: {cls.company}")
@staticmethod # 静态方法,不应该访问类属性
def add(a, b):
print(a + b)
return a + b
# 使用类方法访问类属性
Student.printCompany() # 输出:Company: SXT
# 使用静态方法
Student.add(20, 30) # 输出:50
2.2 输出:
makefile
学校名称: 华东理工大学
当前学生总数: 2
欢迎信息: 欢迎加入华东理工大学!
2.3 解释
突出区别:
-
类方法:
- 通过
cls
访问类的属性和方法。可以修改类的状态,例如更新total_students
。 - 通常用来处理和类本身相关的操作。
- 通过
-
静态方法:
- 不需要访问类的状态,也不依赖实例状态。它是完全独立的功能实现。
- 用于一些独立的操作(例如这里的
greet()
,只需要输出一条消息)。
希望这个案例能清楚地展示它们的区别!
总结
在Python中,面向对象编程的核心包括类方法、静态方法。通过类方法和静态方法可以让类提供通用的功能,理解和掌握这些概念可以让你的代码更加高效和可维护。