学课堂python基础学习day16之面向对象特性(封装→继承→多态)

我是一个22年8月加入享学课堂的学生,主要学习python基础和爬虫课程,学到现在,发现以前的学习知识容易忘记,听了老师的建议之后,决定在CSDN写博客,可以复习自己学过的知识,废话不多说,面向对象特性里到底学了啥。

1 面向对象特性的介绍

面向对象有三个基本特征,即封装、继承、多态。封装可以让代码隐藏细节,用户不用知道具体如何实现,只需要知道怎么用即可;也方便日后的维护。继承可以扩展已有的类,代码可以重复利用。多态顾名思义就是多种形态,打个比方,吃饭这件事,中国人用筷子,外国人用叉子,同样的事情用不同的方法实现。下面就封装、继承、多态做一些详细说明。

2 封装

封装是什么,举个例子,我自己写了一个类,将一个类的属性、方法全部包装到了一个类中。对类中某些方法和属性进行了隐藏(进行私有化),外部实例化类对象之后,无法通过对象.方法或对象.属性访问(会报错)。这些私有属性和方法是因为我不想让外部了解内部的机理或属性,但是会留出一些公开的方法来供外部间接调用这些私有属性和方法。用代码说明一下封装。

class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def show(self):
        print(self.name, self.__age)

stu = Student('张三', 20)
print(stu.name)
print(self.__age)

这里访问self.__age会报错,错误为:

print(stu.__age)
AttributeError: 'Student' object has no attribute '__age'

但其实这个私有属性其实是可以访问的,类中的属性其实是用字典存储的,用print(dir(stu))打印可以得到:

['_Student__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', 
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', 
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'show']

其中有_Student__age,那么可以用stu._Student__age进行访问,但是这些属性是python程序员约定俗称不要去访问。

2 继承

什么是继承,从字面意思来看,一个类是另一个类的子类,那么这个类就可以拥有和父类一样的属性、方法。现实中儿子继承爸爸的长相,财产啥的。

2.1 单继承

class Father:
    sex = "male"
    job = "teacher"
    age = 40
    first_name = "Shen"

    def hobby(self):
        print("爱好钓鱼")

# 子类
class Son(Father):
    job = "student"
    age = 15

s = son()
# 继承父类的hobby方法
s.hobby()



结果为爱好钓鱼。

2.2 多继承

多继承是一个类继承了多个类,拥有多个类的属性和方法。调用继承多个类的方法和属性时,可以用类对象.__mro__,方便查找属性或者方法使用路线,顺序为从左往右的继承,从自己出发,最后为object(object是所有的类的父类)。

class Father:
    sex = "male"
    job = "teacher"
    age = 40
    first_name = "Shen"

    def hobby(self):
        print("爱好钓鱼")

class Mother:
    sex = "female"
    job = "cook"
    age = 39
    first_name = "chen"

    def hobby(self):
        print("爱好看书")


# 子类
class Son(Father,Mother):
    # 覆盖了父类的属性job, age
    job = "student"
    age = 15
    # 根据继承关系,先继承了Father类的sex和first_name属性,hobby方法
    """
    sex = "male"
    first_name = "Shen"

    def hobby(self):
        print("爱好钓鱼")
    """
    """
    关于父类方法,除了继承还有两种操作
    1 重写 父类的要求满足不了,比如儿子的爱好变成了打游戏
     def hobby(self):
       print("打游戏")
    2 除了继承父类的以外还有其他的操作,儿子继承了父亲的爱好钓鱼以外还喜欢打游戏
     def hobby(self):
       # 调用父类的方法
       F().hobby()
       print("打游戏")
    """
s = son()
# 继承父类的hobby方法
s.hobby()

3 多态

多态的概念前面已经讲过了,有两个注意点,一是多态的前提是封装和继承,二是多态是方法的多态,跟属性无关。

# coding:utf-8

# 父类
class Father(object):
    def __init__(self, sex, job, age, first_name):
        self.sex = sex
        self.job = job
        self.age = age
        self.first_name = first_name

    def hobby(self):
        print("basketball")

# 子类1
class Son(Father):
    def __init__(self, sex, job, age, first_name, student_num :
        # 调用父类现有方法
        super().__init__(sex, job, age, first_name)
        # 进行扩展
        self.student_num = student_num

    # 重写
    def hobby(self):
        print("打游戏")


# 子类2
class Daughter(Father):
    def __init__(self, sex, job, age, first_name, student_num ):
        # 调用父类现有方法
        super().__init__(sex, job, age, first_name)
        # 进行扩展
        self.student_num = student_num 

    # 重写
    def hobby(self):
        print("看书")

# 获取爱好
def get_hobby(obj):
    obj.hobby()

    s = Son(sex="male", job="student", age=10, first_name="Zhang", student_num ="001")
    d = Daughter(sex="female", job="student", age=12, first_name="Zhang", student_num ="002")
    # 将s、d两个对象传入相同的函数get_hobby
    get_hobby(s)
    get_hobby(d)

输出结果为打游戏和看书,把不同的对象传入同一个方法,得到的结果不同,这就是多态!】

学习内容就到这里了,至此感谢享学课堂,感谢苯环老师(❀),享学课堂让学习变成一种享受。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值