首页Python【Python基础】19....

【Python基础】19.类的方法


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Basic/lab/index.html
链接:https://pan.baidu.com/s/1x2Ynh_VibPY2u-HWTaJo8w?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Basic

—————————————————

就像之前介绍的,类是包含数据(变量,称为属性)和代码(函数,称为方法)的自定义数据结构。

方法就是类中的函数。

在类中包含有三种类型的方法,有些方法属于类本身,有些方法属于该类的对象,有些则两者都不属于。

  • 实例方法(instance method):该方法没有前置装饰器,其第一个参数必须是self,引用对象本身;

  • 类方法(class method):该方法有前置装饰器@classmethod,其第一个参数应该是cls(或者别的什么,只要不是保留字class就行),引用类本身;

  • 静态方法(static method):该方法有前置装饰器@staticmethod,其第一个参数不能是对象或类。

1.实例方法:

在创建类时,通常编写的就是实例方法。实例方法的第一个参数为self通过它来传递实例的属性和方法(也可以传类的属性和方法)。当调用方法时,Python会将对象传入该方法。

下面定义一个实例方法,获取学生信息。

 1# 定义一个类
2>>class Student:
3...     def __init__(self , name , age):
4...         self.name = name
5...         self.age = age
6...         
7...     def student_info(self):
8...         return f"新增学生姓名:{self.name},年龄:{self.age}。"
9
10# 实例化一个对象
11>>> a_student = Student('Tom' , '12')
12
13# 调用实例方法
14>>> a_student.student_info()
15'新增学生姓名:Tom,年龄:12。'

2.类方法:

类方法影响的是整个类。对类做出任何改动都会影响该类所有的对象。

在类定义中,前置装饰器@classmethod指明接下来的函数是类方法。另外,方法的第一个参数是类本身,通过它来传递类的属性和方法

Python的传统做法是将该参数命名为cls,因为class是保留关键字,无法用于此处。

原则上,类方法是将类本身作为对象进行操作的方法。如果我们需要有个方法,并且该方法在逻辑上采用类本身作为对象来调用更为合理,那么就需要将该方法定义为类方法。另外,如果需要继承,也可以定义为类方法。

实例对象和类对象都可以调用类方法。

下面定义一个类方法,用于调整学生的水平信息students_level

 1# 定义一个类
2>>class Student:
3...     students_level = 0
4...     
5...     def __init__(self , name , age):
6...         self.name = name
7...         self.age = age
8...         
9...     def student_info(self):
10...         return f"新增学生姓名:{self.name},年龄:{self.age}。"
11...     
12...     @classmethod
13...     def set_level(cls , level):
14...         cls.students_level = level
15...         return level
16
17# 实例化对象
18>>> student_1 = Student('Tom' , '12')
19>>> student_2 = Student('Lucy' , '11')
20
21# 调用实例方法
22>>> student_1.student_info() , student_2.student_info()
23('新增学生姓名:Tom,年龄:12。''新增学生姓名:Lucy,年龄:11。')
24# 调用类属性
25>>> student_1.students_level , student_2.students_level
26(00)
27# 调用类方法
28>>> Student.set_level(2)
292
30# 调用类属性
31>>> student_1.students_level , student_2.students_level
32(22)
33# 调用类方法
34>>> student_1.set_level(3)
353
36# 调用类属性
37>>> student_1.students_level , student_2.students_level
38(33)

3.静态方法:

静态方法既不影响类,也不影响类的对象,是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,它出现在类中只是为了方便而已。

静态方法使用@staticmethod作为前置装饰器,参数随意,没有self和cls参数,但是方法体中不能使用类或实例的任何属性和方法

如果我们需要有个方法,并且该方法在逻辑上是独立的,那么我们就要考虑用静态方法。其实,我们也可以在类外面写一个同样的函数来做这些事,但是这样做就打乱了逻辑关系,也会导致以后代码维护困难。

实例对象和类对象都可以调用静态方法。

 1# 定义一个类
2>>class Student:
3...     students_level = 0
4...     
5...     def __init__(self , name , age):
6...         self.name = name
7...         self.age = age
8...         
9...     def student_info(self):
10...         return f"新增学生姓名:{self.name},年龄:{self.age}。"
11...     
12...     @classmethod
13...     def set_level(cls , level):
14...         cls.students_level = level
15...         return level
16...     
17...     @staticmethod
18...     def school_info(name="光明小学"):
19...         return f"学校名称:{name}。"
20
21# 实例化对象
22>>> student_1 = Student('Tom' , '12')
23>>> student_2 = Student('Lucy' , '11')
24
25# 调用实例方法
26>>> student_1.student_info() , student_2.student_info()
27('新增学生姓名:Tom,年龄:12。''新增学生姓名:Lucy,年龄:11。')
28# 调用方法
29>>> student_1.school_info()
30'学校名称:光明小学。'
31# 调用方法
32>>> student_2.school_info("东方小学")
33'学校名称:东方小学。'


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments