MON.面向对象编程

本文详细探讨了面向过程与面向对象编程的区别,强调面向对象编程的扩展性和对象作为数据与功能容器的概念。通过Python代码示例,解释了类如何作为对象的集合体,以及如何使用`__init__`方法初始化对象。文章还阐述了类的属性查找、对象属性的定制以及类和对象之间的关系,揭示了面向对象编程的底层原理。
摘要由CSDN通过智能技术生成

MON.面向对象

面向过程编程

  • 面向过程不是一门技术,是一种编程思想
  • 优点
    • 复杂的问题简单化,流程化
  • 缺点
    • 扩展性差

面向对象编程

  • 一种编程思想

  • 核心是"对象"二字
  • 对象即是"容器",用来盛放数据与功能的

  • 对象的终极奥义,就是将数据和功能高度"整合" ("整合"程度越高,程序的解耦合程度就越高)
  • 容器 ≈ 程序 = 数据 + 功能

  • 优点

    • 扩展性强
  • 缺点

    • 编程复杂度高
1. .py 文件
# 数据
a = 1
b = 0

# 功能
def sum(x, y):
    return x + y

2. 字典、列表、元组、集合
# 功能
def sum(x, y):
    return x + y

# 容器,对象
sum_obj = {'x': 1,
           'y': 2,
           'sum': sum}

# Python 这门语言到底提供了什么语言来允许我们将数据与功能很好地整合到一起
3.Python 中的对象机制
类 -- 对对象进行分类,用以存放同类对象共有的数据与功能
面向对象编程的核心仍然是去使用对象

面向对象的底层原理

def choose_course(stu_dic,course):
    stu_dic['courses'].append(course)
    print("%s 选课成功 %s" % (stu_dic['name'], stu_dic['courses']))

stu1 = {
    'name':'egon',
    'age' : 18,
    'gender' : 'male',
    'courses': [],
    'choose_course':choose_course
}

stu2 = {
    'name':'tom',
    'age' : 18,
    'gender' : 'male',
    'courses': [],
    'choose_course':choose_course
}


stu1['choose_course'](stu2, 'python开发')
stu2['choose_course'](stu2, 'linux开发')

"""
谁来调用就将自己当做第一个参数传入即面向对象的底层原理
"""

  1. 类是对象相似数据与功能的集合体

  2. 类体中最常见的是变量与函数的定义,但是类体其实是可以包含任意其他代码的

  3. 注意: 类体代码在类定义阶段就会立即执行,会产生类的名称空间
  4. 类中存放的是对象共有的数据或功能的空间,本质上是为对象服务,但是类也可以自己调用

定义类

  1. 类体代码在类定义阶段就会立即执行
  2. 产生类的名称空间
  3. 把类的名称空间绑定给类名
  • 类名一般是首字母大写
class Student:
    # 定义变量
    stu_school = 'oldboy'
    
    # 定义功能
    def tell_stu_info(stu_obj):
        print('学生信息: 名字: %s, 年龄: %s, 性别: %s' % (
          stu_obj['stu_name'],
          stu_obj['stu_age'],
          stu_obj['stu_gender']))
    def tell_stu_info(stu_obj):
        stu_obj['stu_name']=x
        stu_obj['stu_age']=y
        stu_obj['stu_gender']=z
    print('======>')
属性访问的语法
1. print(Student.__dict__)

2. 
# 访问数据属性
print(Student.stu_school)

# 访问函数属性
print(Student.set_info)

调用类,产生对象

  • 类的调用不会执行类体代码,仅产生对象并建立关联
# 为对象定制自己独有的属性
1. 方法一
stu_obj.__dict__['stu_name']='jason'
stu_obj.__dict__['stu_age']=18
stu_obj.__dict__['stu_gender']='male'
print(stu_obj.__dict__)

"""
__dict__ 只在对象内部查找,不会向类查找,若所要取的值不在对象内部,则直接报错
"""

2. 方法二
Student.stu_name='egon'
Student.stu_age=18
Student.stu_gender='male'
print(stu_obj.__dict__)

"""
但上述方法有两个问题需要解决
1. 代码冗余,重复过多
2. 属性查找优先级
"""

3. 方法三
def init(stu_obj, name, age, gender):
    stu_obj.name = name
    stu_obj.age = age
    stu_obj.gender = male
    stu_obj.courses = courses
    
# 优化 --> 初始化方法 16:00
def __init__(self, name, age, gender):
    self.name=name
    self.age=age
    self.gender
    self.courses=courses

产生对象发生了几件事

  1. 产生以个空对象
  2. 把该空对象当做第一个参数传递

定制对象的独有属性

class Student():
    school = 'SH'

    # 初始化方法
    def __init__(stu_obj, name, age, gender, courses=[]):
        stu_obj.name = name  # stu1.__dict__['name'] = 'egon'
        stu_obj.age = age  # stu1.__dict__['age'] = 20
        stu_obj.gender = gender  # stu1.__dict__['gender'] = 'male'
        stu_obj.courses = courses  # stu1.__dict__['courses'] = []

    def choose_course(stu_dic, course):
        stu_dic['courses'].append(course)
        print("%s 选课成功 %s" % (stu_dic['name'], stu_dic['courses']))


    # print(123)


# 类的名称空间
# print(Student.__dict__)
stu1 = Student('egon', 18 ,'male')

print(stu1.__dict__)
# stu2 = Student()

# stu1.name = 'egon'      # stu1.__dict__['name'] = 'egon'
# stu1.age = 18           # stu1.__dict__['age'] = 20
# stu1.gender = 'male'    # stu1.__dict__['gender'] = 'male'
# stu1.courses = []       # stu1.__dict__['courses'] = []
#
#
# stu2.name = 'tom'      # stu2.__dict__['name'] = 'egon'
# stu2.age = 18           # stu2.__dict__['age'] = 20
# stu2.gender = 'male'    # stu2.__dict__['gender'] = 'male'
# stu2.courses = []       # stu2.__dict__['courses'] = []


#
# init(stu1, 'egon', 18, 'male')
# init(stu2, 'tom', 18, 'male')
#
#
# print(stu1.__dict__)
# print(stu2.__dict__)

类的属性查找

'''类的属性的增加和更改'''
# 存在即查找或修改,不存在则添加
1.__dict__方法
Student.__dict__['xxx']='xxx'

2.'.'语法取值(推荐)
Student.xxx='xxx'

'''类的属性的查找'''
1.__dict__方法
print(Student.__dict__['xxx'])

2.'.'语法取值
print(Student.xxx)

'''类的属性的删除'''
1.__dict__方法
del Student.__dict__['xxx']

2.'.'语法
del Student.xxx
  • 对象操作属性, '.'语法取值,先从对象中取,如果没有,再从类中取值

  • 类中的属性是共享给所有对象的,类中的方法是给对象用的,并且把对象自己当成第一个参数传递。但是对象的属性是独有的,对对象属性的更改只作用给当前对象

  • 调用类的过程就是实例化,得到的对象就是一个实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值