5.6面向对象
1.认识类和对象
1.什么是类,什么是对象
类 - 类是拥有相同功能和相同属性的对象的集合。(是一个抽象的概念)
对象 - 对象是类的实例(是类的具体表现)
2.定义类(创建类) - 用代码来描述出这个类到底拥有那些相同功能和相同属性的对象的集合
功能 - 函数
属性 - 保存数据的变量
语法:
class 类名:
类的说明文档
类的内容(属性、方法) - 方法是指定义在类中函数,属性是指定义在类中的变量
说明:class - 关键字,固定写法
类名: - 由程序员自己命名,必须符合命名要求和规范,要求:是标识符,不能是关键字;
规范:做到见名知义;采用驼峰式命名(由多个单词组成,单词之间用通过首字母大写来区分);
类名首字母大写,不使用系统的函数名,类名或者模块名
类的说明文档 - 本质就是多行注释
类的内容 - 包含方法和属性
方法包括:对象方法、类方法、静态方法
属性包括:类属性(字段)和对象属性
3.创建对象
对象是类的实例,创建对象必须通过类来创建
语法:
对象 = 类名()
类中的方法
1.对象方法
1)怎么定义:直接定义在类中的函数,就是对象方法
2)怎么调用:通过对象来调用 - 对象.对象方法()
3)特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self(谁去调用这个方法,当前对象就是谁)
2.类方法
1)怎么定义:定义函数前加@classmethod装饰器
2)怎么调用:通过类来调用 - 类.类方法()
3)特点:参数cls不需要传参,系统会自动将当前类传给cls
3.静态方法
1)怎么定义:定义函数前加@staticmethod装饰器
2)怎么调用:
3)特点:没有特点
class A:
'''无意义的类'''
def func1(self):
print('对象方法')
@classmethod
def func2(cls):
print('类方法')
@staticmethod
def func3():
print('静态方法')
# 创建A的对象
a1 = A()
# 用对象调用对象方法
a1.func1()
# 用类调用类方法
A.func2()
# 用类调用静态方法
A.func3()
# 4.类中函数的参数
class B:
def func1(self, x, y=10):
print(f'x:{x},y:{y}')
@classmethod
def func2(cls, x, *, y, z):
print(f'x:{x},y:{y},z:{z}')
@staticmethod
def func3(x, y=9):
print(f'x:{x},y:{y}')
构造函数和init方法
1.构造函数 - 函数名字和类名一样,专门用来创建对象的函数
Python中创建类的时候,系统会自动为我们创建这个类的构造函数.
补充:,魔法方法的特点:
不需要程序员主动调用,在特定事件被触发的时候,系统会自动调用
2.__init__方法
当通过类创建对象的时候,类中的__init__方法会被自动调用
每次通过类创建对象的时候,类中的__init__都被自动调用
class Student:
def __init__(self, x, y):
print('__init__方法', x, y)
stu1 = Student(10, 20)
stu2 = Student(20, 40)
通过类创建对象的时候需不需要参数,需要几个参数,由这个类中的__init__决定
属性
属性分为,对象属性、类属性(字段)
1.类属性
1)怎么定义:直接在类中定义一个变量,这个变量就是类属性
2)怎么使用:通过类来使用 - 类.类属性
3)什么时候用:如果属性值不会因为对象不同而不一样的时候,就将这个属性定义成类属性
2.对象属性
1)怎么定义:以‘self.属性名 = 值’的形式定义在__init__方法中
2)怎么使用:通过对象来使用 - 对象.对象属性
3)什么时候用:如果属性值会因为对象不同而不一样的时候,就将这个属性定义成对象属性
3.__init__方法的拓展
1)如果类需要对象属性,就需要在类中添加__init__
2)可以通过在__init__中添加参数来实现创建对象的时候,直接给属性赋值
方法的选择
1.选择
如果实现函数的功能需要对象(对象属性)就用对象方法;如果需要类就用类方法;如果都不需要就用静态方法
2.对象方法的使用
class Rectangle:
def __init__(self, width=0, height=0):
self.width = width
self.height = height
# 在实现对象方法的功能的时候,如果需要的数据是对象相关数据,那么这个数据就由self来提供
def area(self):
return self.width * self.height
r1 = Rectangle(10, 20)
r2 = Rectangle(5, 8)
print(r2.area())