Python面向对象编程

一、面向对象编程的含义

面向对象编程(OOP)指的是把现实世界的 “事物” 抽象成程序里的 “对象”,用对象来组织代码、处理数据和逻辑的编程思想。

生活中的所有事物都有特征和行为。面向对象编程就是把这种思维搬到代码里,“特征”在代码里就是变量、属性,而“行为”在代码里就是函数、方法。面向对象的编程可以让代码逻辑更清晰、信息更集中。

面向对象编程有两个基本概念:“类”是模版,定义了这类东西有什么属性、能做什么;而“对象”是根据类这个模版来创建的具体实例。

面向对象编程中还有三个重要概念:封装、继承、多态。

封装指的是将类的内部细节打包藏起来,只留接口给外面使用。

继承表示类的从属关系,子类可以继承父类的属性和方法,减少代码冗余。

多态指的是,同一个方法,在不同的子类里分别定义,调用时会产生不同的执行结果。

面向过程和面向对象各有不同使用场景。

主流语言中,C是纯面向过程的,Java是纯面向对象的。

二、创建类

用关键词class可以创建类。

class ClassName:
    # definition
    # ...

三、定义属性

类有一个特殊方法:构造函数,用于定义对象的属性,必须命名为__init__(前后是两个下划线!),括号里可以放任意个参数,但第一个参数必须表示类自身,一般叫self,可以把属性的值绑定在实例对象上。在定义属性的时候前面加上self.,才真正是定义了一个属性而不是一个普通变量。

创建对象的时候,用类名加上一个括号,括号里写上参数,__init__方法就会被调用并返回一个对象(self参数不需要手动传入)。

class Student:
    def __init__(self,student_name,student_id):
        self.name = student_name
        self.id = student_id
        self.score = {'语文':0,'数学':0,'英语':0}

stu1 = Student('张三',1)
print(f'{stu1.name}\t{stu1.id}\t{stu1.score}')

四、定义方法

接下来可以在类里面定义方法。定义方法和定义函数类似,不同之处在于要把第一个参数设为self。

比如,写一个设置学生成绩的方法:

    def grade(self,subject,score):
        if subject in self.score:
            self.score[subject] = score

以及,再写一个打印所有成绩的方法:

    def show_score(self):
        print(f'学生{self.name},学号为{self.id},成绩如下:')
        for subject in self.score:
            print(f'{subject}:{self.score[subject]}')

然后调用一下这两个方法看看结果:

stu1 = Student('张三',1)
stu1.grade('语文',98)
stu1.grade('数学',99)
stu1.grade('英语',100)
stu1.show_score()

五、类继承

定义子类的方法是在子类的类名后面加上括号,括号里写父类的名字。

创建子类实例的时候,会优先调用子类的构造函数。在子类中可以使用用super()函数,这个函数会返回父类,调用父类的构造函数,使子类继承父类的属性。

调用类的方法时,会先在子类里找有没有对应方法,如果没有,再往上一级,在父类中找有没有同名方法。

接下来我们用一个人力系统的具体场景练练手,需求如下:

员工有两类,正式员工RegularEmployee、实习生Trainee。

两者都有属性:姓名name和工号id。

正式员工有属性月薪monthly_salary

实习生有属性日薪daily_salary和每月工作天数work_days

两者都有计算月薪 calculate_monthly_pay的方法,但是计算过程不同。

具体代码实现如下:

class Employee:
    def __init__(self,name,id):
        self.name = name
        self.id = id

    def show_info(self):
        print(f'员工名字:{self.name},工号:{self.id}')

class RegularEmployee(Employee):
    def __init__(self,name,id,monthly_salary):
        super().__init__(name,id)
        self.monthly_salary = monthly_salary

    def calculate_monthly_pay(self):
        return self.monthly_salary

class Trainee(Employee):
    def __init__(self,name,id,daily_salary,work_days):
        super().__init__(name,id)
        self.daily_salary = daily_salary
        self.work_days = work_days

    def calculate_monthly_pay(self):
        return self.daily_salary * self.work_days

zhangsan = RegularEmployee("张三",1000,6000)
lisi = Trainee("李四",1001,200,20)
print(zhangsan.calculate_monthly_pay())
print(lisi.calculate_monthly_pay())

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值