我是一个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)
输出结果为打游戏和看书,把不同的对象传入同一个方法,得到的结果不同,这就是多态!】