Python入门记录(18)面向对象编程

本文介绍了面向对象编程的三大核心特性:封装保护私有变量,继承实现代码复用,以及多态提高灵活性。通过实例演示了如何在Python中实践这些概念,包括私有变量的使用、子类的继承与重写,以及对象间的多态行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象编程的特征

封装:增加安全性
将数据和方法封装在类对象内,通过实例对象进行调用。
在Python中私有变量的定义方法为在前面加两个下划线。
下面举个栗子,也补充一个可以调用私有对象的方法:

# 项目名:pythonProject2
# NAME:demo22
# 开发时间:2021/4/16 18:33
class Student :
    def __init__(self,name,age):
        self.name = name
        self.__age = age #age为私有变量
        return
    def show(self):
        print(self.name,self.__age)
        return

stu1 = Student('szj',24)
stu1.show()
# print(stu1.name,stu1.__age) #age作为私有变量不能在类外被使用,会报错
print(dir(stu1)) #查看stu1中所有的方法以及变量
print(stu1._Student__age) #通过这种方式可以调用私有变量

继承:提高代码的复用性
语法格式:
class 子类名 (父类1,父类2,…)
pass
特征:
1.如果一个类没有继承任何类,则默认继承object
2.Python支持多继承(一个子类可以继承多个父类)
3.定义子类时,必须在其构造函数(即初始化函数__init__)中调用父类的构造函数
举个栗子:

# 项目名:pythonProject2
# NAME:demo23
# 开发时间:2021/4/16 18:59
class Person(object) : #默认即为object
    def __init__(self,name,age):
        self.name = name
        self.age = age
        return
    def info(self):
        print(self.name,self.age)
        return

#定义子类Student继承Person
class Student (Person) :
    def __init__(self,name,age,score):
        super().__init__(name,age) #调用父类的初始化方法将name和age传入子类
        self.score = score
        return

class Teacher (Person) :
    def __init__(self,name,age,teaching_age):
        super().__init__(name,age)
        self.teaching_age = teaching_age
        return

stu1 = Student('szj',24,89)
tch1 = Teacher('lch',3,10)
stu1.info()
tch1.info()
	****方法重写****
	说到方法继承那就接着说方法重写,如果子类对继承父类的某个属性或方法不满意,对其进行重写。重写后的方法可以通过super().xxx()调用父类中被重写的方法。
# 项目名:pythonProject2
# NAME:demo23
# 开发时间:2021/4/16 18:59
class Person(object) : #默认即为object
    def __init__(self,name,age):
        self.name = name
        self.age = age
        return
    def info(self):
        print(self.name,self.age)
        return

#定义子类Student继承Person
class Student (Person) :
    def __init__(self,name,age,score):
        super().__init__(name,age) #调用父类的初始化方法将name和age传入子类
        self.score = score
        return
    def info(self):
        super().info()
        print(self.score)

class Teacher (Person) :
    def __init__(self,name,age,teaching_age):
        super().__init__(name,age)
        self.teaching_age = teaching_age
        return

stu1 = Student('szj',24,89)
tch1 = Teacher('lch',3,10)
stu1.info()
tch1.info()
stu1.info()

这里的stu1.info()就是Student类将Person类中的info()方法重写之后的输出结果。其实最直观的我们可以看到,在创建子类的时候,子类的初始化方法就是对父类初始化方法的重写,这也是最好的重写的例子。

Obeject类
object类是所有类的父类,其内置函数dir()可以查看指定对象所有的属性。在编写的类中可以对object类中的方法进行重写。
下面进行一下对比:

# 项目名:pythonProject2
# NAME:demo24
# 开发时间:2021/4/17 20:22
class Student:
    def __init__(self,name,age,gradeid):
        self.name = name
        self.age = age
        self.gradeid = gradeid
stu = Student('szj',24,4)
print(dir(stu))
print(stu)

结果为:
在这里插入图片描述
我重写了object类的str方法:

# 项目名:pythonProject2
# NAME:demo24
# 开发时间:2021/4/17 20:22
class Student:
    def __init__(self,name,age,gradeid):
        self.name = name
        self.age = age
        self.gradeid = gradeid
        return
    #重写object类的str方法
    def __str__(self):
        return '学生名字为%s,年龄%d岁,就读大学%d年级'%(self.name,self.age,self.gradeid)
stu = Student('szj',24,4)
print(dir(stu))
print(stu)

输出结果为:
在这里插入图片描述
str方法就是将实例对象的信息进行输出,通常更改后可以输出初始化的信息,这样子更加直观。当然这里也是对前面重写的复习了。

多态:提高程序的可扩展性和可维护性

# 项目名:pythonProject2
# NAME:demo25
# 开发时间:2021/4/18 17:27
#多态
class Animal():
    def eat(self):
        print('animal eat')
        return

#定义Dog类继承Animal类并重写eat方法
class Dog(Animal):
    def eat(self):
        print('dog eat')
        return
#定义Cat类继承Animal类并重写eat方法,并在其中调用父类的eat方法
class Cat(Animal):
    def eat(self):
        super().eat()
        print('cat eat')
        return

#People类不继承Animal类,但也有eat方法
class People():
    def eat(self):
        print('people eat')
        return

#定义fun()函数,需要传入Animal类参数
def fun(Animal):
    Animal.eat()
    return

cat = Cat()
dog = Dog()
person = People()
animal = Animal()
fun(cat) #输出两次,因为重写过程中也调用了父类的方法
fun(dog) 
fun(person)
fun(animal)

虽然在fun()函数定义的时候规定了传入的参数需要是Animal类,但是因为Dog类和Cat类都是Animal类的子类,所以也可以传入,而People类由于也定义eat()方法,所以也可以作为参数传入fun()函数中。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值