一、概述python 类与对象
类 = 面向对象 (×)
- 类只负责去描述,定义行为,不负责执行代码,不能在类内执行方法(函数)
- 定义 类 和 类的使用 应该在不同模块中
- 类:包含 特征(变量) 与 行为(函数)
- 类最基本的作用:封装代码
面向对象的核心
- 类(行为与特征)
- 对象
注意: 实现面向对象编程重在 编写有意义的面向对象的代码
二、定义类
类名第一个字母大写,不建议使用下划线连接单词,而是都大写StudentHomework
在类的内部可以:
1.定义若干个变量 2.定义函数
1. 构造函数
- 构造函数的调用是在实例化时自动进行的
- 可以显示调用 构造函数,**返回 必须为 None 类型**
- **显示调用构造函数不会生成一个对象**
def __init__(self):
pass
a = Student.__init__() # 返回 None,**显示调用构造函数 不会创建一个对象**
通过构造函数完成对类的使用,生成对象
# 使用类
# 实例化类,实例化时若构造函数中有参数,必须传入
student = Student('时感到', 22) # 实例化不需要new关键字
2. 定义实例变量和实例方法
必须通过self关键字
def __init__(self, name, age):
# 初始化对象的特征值
# 此处定义实例变量,通过self定义+实例变量名字
self.name = name
self.age = age
# 实例方法 默认第一个参数为self
def do_homework(self):
print('do homework')
3. 类变量
定义类变量注意 类变量的定义要注意 其意义
students_sum = 0 # 班级所以学生总数 name = 'qiyue' # 这种就不叫作类变量了
# 此处定义为 类变量 --> 类变量的定义要注意 其意义
students_sum = 0 # 班级所以学生总数
name = 'qiyue' # 这种就不叫作类变量了
def __init__(self, name, age):
# 实例方法访问 类变量
Student.students_sum += 1
# 等同于self.__class__.students_sum += 1
# self内置__class__ 指向 类 本身
注意:self内置__class__ 指向 类 本身,可以通过其访问类变量 调用类变量
- 在实例方法和类外通过类名.变量名 调用
- 类方法内通过 cls.变量名调用
4. 类方法
- 关键在于 装饰器 @classmethod,此装饰器是类方法与实例方法的 根本区别
- 注意类方法中调用类变量的不同,定义时传入的参数指向本类 cls
# 类方法 --> 需使用装饰器
@classmethod # 此装饰器是类方法与实例方法的 根本区别
def plus_sum(cls):
# 类方法操作类变量
cls.students_sum += 1
调用类方法:
# 调用类方法 Student.plus_sum()
# 通过对象调用类方法 student.plus_sum()
5. 静态方法
不需要默认参数,可以访问类变量,访问方式与实例方法相同
# 静态方法 (不需默认参数)
@staticmethod
def add(x, y):
# 可以访问类变量
print(Student.students_sum)
pass
调用静态方法:可以通过类 也可以通过对象 调用
# 调用静态方法
student.add(1, 2)
Student.add(1, 2)
三、总结
1. 方法和函数的区别:
- 方法: 设计层面 的称谓
- 函数: 程序运行、过程式的一种称谓
2. 变量与数据成员:
- 数据成员,类内的变量,刻画类的特性
3. 类和对象:
- 类是现实世界或思维试接中的实体在计算机中的反映, 它将数据以及这些数据上的操作封装在一起
- 类: 行为与特征
- 对象:表是一个具体的概念
对象 = 类的实例化
4. 类变量 与 实例变量
类变量不能与模块变量等同,各有规则
- 要将每个对象的特征值保存在 实例变量中
- 实例变量通过 self关键字定义,在
__init__函数中 - 类变量与具体的对象无关
- 类与对象的变量查找顺序 --> 先实例变量再类变量( 类外部调用此机制才存在 )
__dict__ 对象内置变量,用于保存当前对象下所有相关的变量(实例变量)
print(student.__dict__)
print(Student.__dict__)
self:
- 定义实例方法默认第一个参数
- 调用实例方法时不需要传入,python默认传入 意义: self即当前调用某一个方法的对象,只和对象有关
整体代码:
class Student():
# 类体
'''
在类的内部可以:
1.定义若干个变量 2.定义函数
'''
# 此处定义为 类变量 --> 类变量的定义要注意 其意义
students_sum = 0 # 班级所以学生总数
name = 'qiyue' # 这种就不叫作类变量了
# 构造函数
'''1.构造函数的调用是在实例化时自动进行的
2.可以显示调用 构造函数,返回 必须为 None 类型
3.显示调用构造函数不会生成一个对象
'''
def __init__(self, name, age):
# 初始化对象的特征值
# 此处定义实例变量,通过self定义+实例变量名字
self.name = name
self.age = age
# 实例方法访问 类变量
Student.students_sum += 1
# 等同于self.__class__.students_sum += 1
# self内置__class__ 指向 类 本身
# 实例方法 默认第一个参数为self
def do_homework(self):
print('do homework')
# 类中编写函数(方法)必需有 self 参数
def print_file(self):
print('name: ' + self.name)
print('age: ' + str(self.age))
# 类方法 --> 需使用装饰器
@classmethod # 此装饰器是类方法与实例方法的 根本区别
def plus_sum(cls):
# 类方法操作类变量
cls.students_sum += 1
# 静态方法 (不需默认参数)
@staticmethod
def add(x, y):
# 可以访问类变量
print(Student.students_sum)
pass
# 使用类
# 实例化类,实例化时若构造函数中有参数,必须传入
student = Student('时感到', 22) # 实例化不需要new关键字
print(student.__dict__)
print(Student.__dict__)
student.print_file() # 调用类下面的方法
# 调用类变量 Student.sum
# 调用实例变量 student.name
# 调用类方法 Student.plus_sum()
# 通过对象调用类方法 student.plus_sum()
# 调用静态方法
student.add(1, 2)
Student.add(1, 2)
'''
方法和函数的区别:
方法: 设计层面 的称谓
函数: 程序运行、过程式的一种称谓
变量与数据成员:
数据成员,类内的变量,刻画类的特性
'''
'''
类和对象:
1.类是现实世界或思维试接中的实体在计算机中的反映
它将数据以及这些数据上的操作封装在一起
2.类: 行为与特征
3.对象:表是一个具体的概念
对象 = 类的实例化
'''
# 类的实例化与意义
# a = student.__init__() # 返回 None,显示调用构造函数 不会创建一个对象
# print(a)
# 构造函数的作用:可以使类生成不同的对象
'''
类变量 与 实例变量
类变量不能与模块变量等同,各有规则
1.要将每个对象的特征值保存在 实例变量中
实例变量通过 self关键字定义
2.类变量与具体的对象无关
3.类与对象的变量查找顺序 --> 先实例变量再类变量( 类外部调用此机制才存在 )
__dict__ 对象内置变量,用于保存当前对象下所有相关的变量
print(student.__dict__)
print(Student.__dict__)
'''
'''
self:
1. 定义实例方法默认第一个参数
2. 调用实例方法时不需要传入,python默认传入
意义: self即当前调用某一个方法的对象,只和对象有关
'''