面向对象编程,其属性特性,用法等

在PYTHON 海洋畅游

面向对象编程

1、如何基于面向对象的思想写程序

  • 面向对象的基本思路就是把程序中要用到的、相关联的数据与功能整合到对象里,
  • 然后再去使用,但程序中要用到的数据以及功能那么多,如何找到相关连的呢?
  • 我需要先提取选课系统里的角色:学生、老师、课程等,然后显而易见的是:
  • 学生有学生相关的数据于功能,老师有老师相关的数据与功能,我们单以学生为例,

例1: 非面向对象编写的程序

# 学生的数据
stu_name = "egon"
stu_age = 18
stu_gender = "male"

# 学生的功能
def choose(name, age, gender):
    print('%s:%s:%s 正在选课' % (name, age, gender))
    
choose(stu_name,stu_age,stu_gender)
  • 上述的代码,乍一看可能感觉非常简洁,但是我们需要考虑,学生的个数,难道我们一直就以此格式去填写吗?
  • 很明显是不可能的

例2:基于对象式的思想进行改写

def choose(stu_self):
    print('%s:%s:%s 正在选课' % (stu_self["stu_name"], stu_self["stu_age"],stu_self["stu_gender"],))

stu_obj = {
    "school" = "oldboy"
    "stu_name": "egon",
    "stu_age": 18,
    "stu_gender": "male",
    "choose":choose
}

# print(stu_obj["stu_name"])
stu_obj["choose"](stu_obj)
  • 上述的代码,就是我们最最简单的面向对象刚入门的时候所编写的程序
  • 我们能不能在此基础上在进行一些优化呢。例如我们将它的一些共有的东西放到另外的字典去,当做公共使用的一个字典。

例3:基于python提供专门的语法来更漂亮地实现面向对象编程

  • 我们把独有数据和共有数据分开
学生对象1
    数据:
        名字 = "冯疯子"
        年龄 = 18
        性别 = "female"
学生对象2
    数据:
        名字 = "郭靖"
        年龄 = 19
        性别 = "male"
学生对象3
    数据:
        名字 = "大雕"
        年龄 = 200
        性别 = "male"
学生的类
    相同的数据
        学校 = "oldboy"
    相同的功能
        选课

我们python中有一个class 方法可以帮我们去生成一个类去和对象进行关联的。

基于上述分析的结果,我们接下来需要做的就是在程序中定义出类,然后调用类产生对象

class Student: # 类的命名应该使用“驼峰体”
    school='oldboy' # 数据
    def choose(self): # 功能
        print('%s is choosing a course' %self.name)

类体最常见的是变量的定义和函数的定义,但其实类体可以包含任意Python代码,类体的代码在类定义阶段就会执行,因而会产生新的名称空间用来存放类中定义的名字,可以打印Student.__dict__来查看类这个容器内盛放的东西

print(Student.__dict__)
{..., 'school': 'oldboy', 'choose': <function Student.choose at 0x1018a2950>, ...}

调用类的过程称为将类实例化,拿到的返回值就是程序中的对象,或称为一个实例

stu_obj1=Student() # 每实例化一次Student类就得到一个学生对象
stu_obj2=Student()
stu_obj3=Student()

全代码案例:

class Student:
    # 相同的数据
    school = "oldboy"

    # 相同的功能
    def choose(self):
        print("正在选课")

    # print('====>')

stu_obj1=Student() # 每实例化一次Student类就得到一个学生对象
stu_obj2=Student()
stu_obj3=Student()

stu_obj1.name = "冯疯子"  # stu1_obj1.__dict__["name"] = "冯疯子"
stu_obj1.age = 18
stu_obj1.gender = "female"

stu_obj2.name = "郭靖"
stu_obj2.age = 19
stu_obj2.gender = "male"

stu_obj3.name = "大雕"
stu_obj3.age = 200
stu_obj3.gender = "male"

print(Student.__dict__)
print(stu_obj1.__dict__)
print(stu_obj2.__dict__)
print(stu_obj3.__dict__)

结果:

{'__module__': '__main__', 'school': 'oldboy', 'choose': <function Student.choose at 0x000001ABEE3D5790>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
{'name': '冯疯子', 'age': 18, 'gender': 'female'}
{'name': '郭靖', 'age': 19, 'gender': 'male'}
{'name': '大雕', 'age': 200, 'gender': 'male'}
  • 我们针对,上述我们所写好的代码去修改一下,将其精简一下。
  • 针对其对对象的修改我们将其简化一下,利用函数去简化。

结果如下:

stu_obj1=Student()
stu_obj2=Student()
stu_obj3=Student()

def init(obj,x,y,z):
    obj.name=x
    obj.age=y
    obj.gender=z


init(stu_obj1,'冯子涵',18,'female')
init(stu_obj2,'郭靖',19,'male')
init(stu_obj3,'大雕',200,'male')
  • 看似这个代码已经很简洁了
  • 但是我们将函数放在 定义类的里面,那么我们就可以更加简洁了。

方案三:

class Student:
    school = "oldboy"
    #             空对象
    def __init__(obj, x, y, z):
        obj.name = x
        obj.age = y
        obj.gender = z
        # return None # 只能返回None
    def choose(self):
        print("正在选课")
# 调用类:
# 1、创建一个空对象与类相关
# 2、把空对象、"冯疯子", 18, "female"一起传给__init__方法,完成对象的初始化
# 3、赋值符号把初始化好的对象的内存地址绑定变量名stu_obj1
stu_obj1 = Student("冯疯子", 18, "female")
stu_obj2 = Student("郭靖", 19, "male")
stu_obj3 = Student("大雕", 200, "male")

print(stu_obj1.__dict__)
  • 像这样修改了以后我们就可以更加简洁了,从几十行简洁成了十几行。

2, 类中需要注意的事项

类的使用步骤:
① 在程序中使用时必须先定义类:即申请内存空间,将对象之间相同的数据与功能存放起来,类名指向该名称空间
	与函数不同,类在定义的时候就会立即执行类的代码,运行过程中产生的名字会丢进类的名称空间中
② 调用类来产生对象,调用类的过程被称之为实例化,
本质上调用类就是产生一个与类相关联的子空间
一.在类中定义的函数是需要输入值的。
class Student:
    school = "oldboy"
    #             空对象
    def __init__(obj, x, y, z):
        obj.name = x
        obj.age = y
        obj.gender = z
        # return None # 只能返回None
    def choose(self):
        print("正在选课")
#第9行就可以看出。 我们必须把参数传进去才能调用。
二.我们需要了解,类和对象之间的关系

在这里插入图片描述

在内存空间中我们会刷出一个类的内存空间,然后我们在内存空间中放置的是公共数据和公共方案。

我们创建类以后,调用类,我们就会创建新的内存空间去存放对象的独有数据,而且对象可以找到类中的共有数据。

三 使用类的__init__方法可以完成对空对象的初始化
class Student:
    school = "外婆交大"
    def __init__(obj, x, y, z):
        obj.name = x
        obj.age = y
        obj.gender = z
       
    def choose_course(self):
        print("正在选课")

注意点:定义在类内的函数,不能有非None的返回值,不然会与类返回的对象产生冲突

四 调用类的步骤:
① 先创建一个与类相关联的子空间
② 自动触发__init__方法,将name,age,gender等一起传给__init__方法,完成空对象的初始化
③ 返回一个初始化好的对象,用赋值符号将对象的内存地址绑定给stu1这种变量名
123
五 调用类产生对象
stu1 = Student('jason', 18, 'male')
stu2 = Student('jimmy', 19, 'male')
stu3 = Student('red', 20, 'female')

3, 属性操作

一 查找优先级

对象调用属性会先从对象字典里找,找不到就去类的字典里找

stu1.choose_course()  # 调用类里的函数,等同于choose_course(stu1)
1

二 类属性操作

类与对象都可以用.来访问属性并完成增删改查的操作
① 访问类的数据属性
可以作出修改,改完后,所有的对象调用时全都会跟着改

Student.school = "贱桥大学"  # 调用数据属性,并作出修改
1

② 访问类的函数属性
类.函数名()的方式调用函数,就是一个普通的函数调用方法,不会自动传入self参数,需要手动添加

Student.choose_course(stu1)  # 调用函数choose_course
1

三 属性操作

① 类中定义的数据属性就是共享给所有对象使用的,所有对象访问的是同一个内存地址
② 类定义的函数是绑定给所有对象使用的,
对象调用函数会将对象作为第一个参数传入(即自动传入self参数)

stu1.choose_course()  # 不需要手动传入self参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值