Python课堂19——面向对象

文章目录


前言

面向对象是一种编程范式,以对象作为程序的基本单位,通过定义对象的属性和方法,来描述对象的行为和特征。Python是一种支持面向对象编程的语言,提供了丰富的面向对象的特性和语法。

在Python中,对象是由类创建的,一个类是一个对象的蓝图或模板,定义了该类对象的属性和方法。类可以看作是一种自定义的数据类型,可以创建多个该类的对象。为大型程序的开发提供便利!


一、面向过程和面向对象

  1. 面向过程:先分析出解决问题的步骤,再把步骤拆分成一个个方法(函数)是没有对象去调用的,只是由单个的函数语句执行。
  2. 面向对象:把变成当做是一个事物(对象),将程序中的数据和操作封装在一起,形成一个对象。在面向对象编程中,程序的执行是通过对象之间的交互来完成的。

面向对象的核心就是将对象的数据和将要实现的功能整合成一个整体

二、类和对象

1.类

定义:对一系列具有相同属性和事物的统称,是一个抽象的概念,不是真实存在的事物。

基本格式:

class 类名:(类名遵循大驼峰的命名规则,前面的章节中说过)

代码块

代码如下:

python 复制代码
class Student:
	pass

2.对象

定义:类的具体表现

实例化(创建)对象的格式:对象名 = 类名()

python 复制代码
s1 = Student()

注意:

1.先有类,后有对象

2.类只有一个,对象有多个

3.类存在的意义:存放对象共同的功能和属性数据

实例展示:(学生选课系统)

python 复制代码
'''
    选课对象:学生
        属性:姓名、学号、课程
        功能:选课、查课
    谁上课?老师
        属性:班级、id
        功能:选择上课
'''
class Student:
    def choose(self):
        print('学生选课')

    def check_course(self):
        print('学生查课')


s1 = Student()
s2 = Student()
print(s2)
print(s1)
# 实例化多个对象的内存地址不同,可以创建一个或者多个对象,互不影响

3.类中定义的方法

3.1  实例方法:是给对象用的,会自带有self参数

代码演示

python 复制代码
class Student:
    def choose(self):
        print('选课')
        print(f'实例方法;', self)  # 谁调用它,self就是谁

    def check_course(self):
        print('查课')

s1 = Student()  # 调用类的过程称之为类的实例化,拿到的返回值是程序中的对象,称之为一个实例,实例对象
s2 = Student()
print(s2)
print(s1)
# 通过实例化一个对象 / 通过类创建一个对象

如何调用类中的函数?

语法:对象名.实例方法()

python 复制代码
s1.choose()
s2.choose()

# 类调用实例方法
# Student.choose()  # 缺少一个self参数

print(s1)  # <__main__.Student object at 0x000001F59B970CC8>
s1.choose()  # <__main__.Student object at 0x000001F59B970CC8>
# 实例方法中的哪个对象调用,self就是这个参数的内存地址

4.定义类中的属性

4.1 类属性:定义在类中,并且在函数体外的属性,所有的实例对象都可以用

python 复制代码
class Student:
    a = 'abc'
    school_name = 'university'
    name = '小明'
    def choose(self):
        print('选课功能')
 
s1 = Student()
s2 = Student()
s3 = Student()

访问方式:

(1)对象.属性名:print(s1.a)

(2)类.属性名:print(Student.a)
注意:类和对象都可以访问类属性

修改类属性:

(1)对象修改:对象.属性 = 新的值,对象不能修改类属性,做修改的操作其实只是给自己空间里新增了一个新的实例属性。

python 复制代码
s1.a = '9999'
print(s1.a)  # 9999
print(s2.a)  # abc
print(s3.a)  # abc 
print(Student.a)  # abc

(2)只能由类去修改类属性

python 复制代码
Student.a = 'Hahahhah'
print(s1.a)  # Hahahhah
print(s2.a)  # Hahahhah
print(s3.a)  # Hahahhah
print(Student.a)  # Hahahhah
# 学生类里类属性,所有的学生去访问的值都一样,可以把学生共用相同的数据值定义为类属性,比如:学校的名称、学校的地址
# 学生的名字能定义为类属性 ,所有的学生名字很明显不一样,如果定义为类属性,所有学生名字一样,乱套了。

4.2 实例属性:实例对象帮的属性,仅对象所独有

方法:创建实例对象后,动态的对属性进行绑定 对象名.属性 = 属性值

python 复制代码
class Student:
    # a = 'abc'
    school_name = '好学大学'
    def choose(self):
        print('选课功能')

s1 = Student()
s1.name = '小明'
s1.course = 'python'
s2 = Student()
s2.name = '小红'
s2.course = 'java'
s3 = Student()
s3.name = '小帅'
s4 = Student()
s4.name = '小林'
# 问题:把名字属性定义为类属性,创建对象后,再手动的对名字属性进行修改,比较麻烦。
# 引入构造函数来解决

5.构造函数

语法:def init (self):

特点:每当创建一个对象的时候,自动调用该方法

python 复制代码
class A:
    def __init__(self):
        print('自动调用')
s1 = A()  # 自动调用
s2 = A()  # 每创建一个对象,自动调用

属性初始化数值操作

方法一:对象.属性名 = 数值

方法二:self.属性名 = 数值

python 复制代码
class Student:
    a = 'abc'

    def __init__(self, Name, Course, Id):
        self.name = Name
        self.course = Course
        self.id = Id

    def choose(self):
        print('选课')
        print(f'实例方法;', self)  # 谁调用它,self就是谁

    def check_course(self):
        print('查课')


s1 = Student('Abner', 'pyhton', '029')
print(s1.name)
# 在类的外面:对象.属性名
# 在类的里面:self.属性名

# 类属性:所有对象所共有的
# 实例属性:所有对象独有的

6.析构方法和__str__(拓展)

python 复制代码
class A:
    def __init__(self):
        self.name = 'Abner'
        print('创建对象的时候自动调用')

    def __str__(self):
        # 返回对象的一个描述信息------字符串
        return f'对象名:{self.name}'

    def __del__(self):
        # 删除一个值,销毁一些实例对象,调试功能,能做一些什么工作
        print('销毁对象的时候做的一些操作以及程序执行的最后也会触发这个操作')
        # 比如关闭一些文件
s1 = A()
print(s1)

总结

面向对象的学习是我们进入高级编程学习的第一步,继续加油,相信你会成为一名优秀的编程师。

努力的时间还不够 哪有时间去绝望啊 ------ 余安

相关推荐
ᅠᅠᅠ@1 分钟前
异常枚举;
开发语言·javascript·ecmascript
编程版小新7 分钟前
C++初阶:STL详解(四)——vector迭代器失效问题
开发语言·c++·迭代器·vector·迭代器失效
c4fx27 分钟前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
鸽芷咕1 小时前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
子午1 小时前
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
人工智能·python·cnn
代码雕刻家1 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
Fan_web1 小时前
JavaScript高级——闭包应用-自定义js模块
开发语言·前端·javascript·css·html