1、理论上的定义:
类:就是拥有相同功能和属性的对象的集合。(抽象)
对象:类的实例(具体)
2、从生活角度
如果说人这个物种是一个类,那么每一个人就是一个对象。
3、编程方式
面向过程编程:以算法为工具
函数式编程:以函数为工具
面向对象编程:以类和对象为工具(面向生活)
类:对拥有相同功能(方法)和相同属性的封装。
封装效果:一个类中可以对多个功能进行封装(多个函数);封装多个属性
一、类的声明格式
class 类名(父类列表):
"""类的说明文档"""
类的内容
class:声明类的关键字。
类名:标识符,不能是关键字。首字母必须大写!采用驼峰式命名。例如:StudentSystem。
(驼峰式命名:第一个单词首字母小写,其他单词的首字母大写)
父类列表:这个部分可以省。这是一个继承语法,可以多继承。
类的内容:类的方法和属性。
二、类中的方法
调用方式:对象.函数名()
方法:就是声明在类中的函数
方法分类:对象方法,类方法,静态方法。
直接写在类中的方法,自带一个 self 参数
对象方法:通过对象来调用。
三、构造方法
- 构造方法:系统自动创建,方法名和类名一样。用来创建对象。
- _init_:方法的功能是用来做初始化和添加对象属性。
- 当我们通过构造方法去创建对象的时候,系统会自动调用init方法。
- 如果类的 init 方法有参数,通过给构造方法传参。
四、创建对象
创建类的时候,系统会默认创建这个类对应的构造方法(方法名和类名相同)。一个类可以有多个对象,只要调用构造方法,就会产生新的对象。
- 构造方法:类名() --> 创建类对应的对象
- 通过对象调用对象方法,默认参数 self 不需要传参。
- 创建对象的过程:调用构造方法在内存中开辟空间创建一个对象,然后用新建的这个对象去调用 init 方法来初始化对象的属性,最后才将对象返回。
class Person:
"""
人类
"""
def eat(self):
print('人吃饭')
#创建Person类的对象,并且将对象的地址存到 p1中
p1 = Person()
p1.eat()
五、对象属性
1、属性
对象的属性:不同的对象,对应的值可能不一样,这样的属性是对象属性。属于对象类中的对象属性是声明在 init 方法中的。
- 声明格式是:self . 属性名 = 初始值
- 对象的使用:对象 . 属性名
方法一
class Student:
"""学生类"""
def __init__(self):
#声明对象的属性name,age,id
self.name = '张三'
self.age = 0
self.id = '001'
stu1 = Student()
print(stu1.name,stu1.age,stu1.id)
#通过对象去修改对象的属性
stu1.name = '星辰'
print(stu1.name)
方法二
class Dog:
"""狗类"""
def __init__(self, type1, color1):
self.type = type1
self.color = color1
dog1 = Dog('土狗','黄色')
print(dog1.type, dog1.color)
方法三
class Computer:
"""电脑类"""
def __init__(self, color='白色', memory=0):
self.color = color
self.memory = memory
com1 = Computer()
print(com1.color,com1.memory)
类的字段(属性):属于类,所有对象对应的值是一样的。
2、属性的增删改查
python是动态语言,python中类的对象的属性可以进行增删改查的操作。
- 查
方法一:对象.属性名(常用)
方法二:getattr(对象, 属性名, default=None)
属性不存在可以通过设置默认值,让程序不崩溃,并且返回默认值。
方法三:对象._getattribute_(属性名) - 改
方法一:对象.属性 = 新值(常用)
方法二:setattr(对象, 属性名,值)
方法三:对象._setattr_(属性名,值) - 增
方法一:对象.属性 = 新值(属性不存在,就是添加)
方法二:setattr(对象, 属性名,值)
方法三:对象._setattr_(属性名,值) - 删
方法一:del 对象.属性
方法二:delattr(对象,属性)
方法三:对象. _delattr_(属性)
六、类的属性(字段)
1、类的字段:就是声明在类的里面,方法的外面的变量
class Person:
#这个number就是类的字段
number = 6
2、什么时候声明类的属性:
属于类,并且对于类的所有对象来说是共有的。
3、怎么使用
print(Person.number)
七、对象方法
- 直接声明在类中的函数默认是对象方法,有一个默认参数 self
- 对象方法要通过对象来调用:对象.对象方法
- 对象方法中默认参数 self , 不需要传参。因为在调用这个方法时,系统自动当当前对象传给 self 。
- 哪个对象调用,self 就指向谁。对象能做的事情,self 也能做,本质上是一样的
练习:
# 1、写一个矩形类,有属性长和宽,功能:求周长和面积
class Rect:
def __init__(self, width, weight):
self.width = width
self.weight = weight
def perimeter(self):
print('周长是:',(self.weight + self.width)*2)
def area(self):
print('面积是:',(self.width*self.weight))
rect1 = Rect(3,4)
rect1.perimeter()
rect1.area()
周长是: 14
面积是: 12
#2、写一个班级类,班级里面有多个学生的成绩,可以获取成绩的最高分
class Class_python:
def __init__(self,*score):
self.score = score
def score_max(self):
a = list(self.score)
a.sort()
print('最高分是:%d'%a[-1])
class1 = Class_python(2,3,4,5,23,43,32,)
class1.score_max()
最高分是:43
八、类的方法
声明形式:声明方法前需要使用@classmethod说明。
特点:自带一个默认参数 cls,这个参数调用的时候不需要传值。系统自动传值,谁调用指向谁。(因为只能被类调用,所以始终指向当前类)
调用:通过类来调用 --> 类.类方法()
class Class1:
#声明一个对象方法
def class2(self):
print('这是一个对象方法')
#声明一个类方法
@classmethod
def class_func(cls):
print('这是一个类方法')
九、静态方法
声明形式:声明方法前需要使用@staticmethod说明。
特点:没有默认参数
调用:通过当前类调用 --> 类.静态方法()
@staticmethod
def static_func():
print('这是一个静态方法')
调用
c1 = Class1()
c1.static_func()
十、怎么选择三种方法
a、只要实现方法的功能需要用到对象的属性,我们就使用对象方法;否则就使用静态方法或者类方法。
b、不使用对象方法的前提下,如果实现功能需要用到类的字段,就用类方法。
c、实现功能既不需要对象的属性,又不需要类的字段,就使用静态方法。
注意:静态方法和类方法划分不用那么严格,因为静态方法能做的,类方法也能使用;反之亦然。