◎知识点
封装的定义及使用
继承的概述及应用
重写的定义及示例
◎脚本练习
▽ 封装
"""一、封装""" """ 封装是面向对象编程的三大特征之一 封装有两方面的含义: 1. 将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。 这样,无需关心方法内部的具体实现细节,从而隔离了复杂度 2. 在类对象的内部通过访问控制把某些属性和方法隐藏起来,不允许在类对象的外部直接访问,而是在 类对象的内部对外提供公开的接口方法(例如getter和setter)以访问隐藏的信息。这样,就对隐藏的信息进行了保护 """ class Student(object): def __init__(self): self.__score = 90 def get_score(self): return self.__score def set_score(self, score): if 0 <= score <= 100: self.__score = score else: raise ValueError("成绩必须在0~100之间") s = Student() s.set_score(88) print(s.get_score()) # 88 # s.set_score(123) # ValueError: 成绩必须在0~100之间
▽ 继承的概述
"""二、继承的概述""" """ 1、为什么需要继承? 在下面的程序中,由于狗和鸟都具有吃饭和喝水的这两个功能,所以,类对象Dog和Bird中都定义了 eat()和drink()这两个方法,并且这两个方法的代码是完全相同的,这样就导致了程序中存在重复的代码 class Dog(object): def eat(self): print("吃饭") def drink(self): print("喝水") def swim(self): print("游泳") class Bird(object): def eat(self): print("吃饭") def drink(self): print("喝水") def fly(self): print("飞翔") """ """ 2、什么是继承? 当几个类对象中有共同的属性和方法时,就可以把这些属性和方法抽象并提取到一个基类中,每个类对象 特有的属性和方法还是在本类对象中定义,这样,只需要让每个类对象都继承这个基类,就可以访问基类中的 属性和方法了。继承基类的每个类对象被称为派生类。基类也被称为父类或超类,派生类也被称为子类 python中的所有类对象都继承自一个统一的基类:object。这就是为什么我们在定义类对象时要在类名后面添加(object) 除了封装,继承也是面向对象编程的三大特征之一。继承是实现代码复用的重要手段 """ class Animal(object): def eat(self): print("吃饭") def drink(self): print("喝水") class Dog(Animal): def swim(self): print("游泳") class Bird(Animal): def fly(self): print("飞翔") dog = Dog() dog.eat() # 吃饭 dog.drink() # 喝水 dog.swim() # 游泳 bird = Bird() bird.eat() # 吃饭 bird.drink() # 喝水 bird.fly() # 飞翔
▽ 继承的应用
"""三、继承应用""" """ 子类只有一个直接父类时称为单继承,假设子类和父类分别为ChildClass和ParentClass, 子类继承父类的语法格式为: class ChildClass(ParentClass): pass 子类有多个直接父类时称为多继承,假设子类是ChildClass,直接父类是ParentClass1, ParentClass2,...,ParentClassn,子类继承父类的语法格式为: class ChildClass(ParentClass1, ParentClass2, ..., ParentClassn): pass """ """ 子类会继承所有父类(包括所有直接父类和所有间接父类)的所有属性和方法 """ class ParentClassA(object): ca = 18 def im(self): print("im()被调用了") class ParentClassB(object): __pca = 23 def __pim(self): print("__pim()被调用了") class ParentClassC(ParentClassA, ParentClassB): @classmethod def cm(cls): print("cm()被调用了") class ParentClassD(object): @staticmethod def sm(): print("sm()被调用了") class ChildClass(ParentClassC, ParentClassD): pass print(dir(ChildClass)) """ 子类可以添加父类中没有的属性和方法 """ class BaseClass(object): ca_base = 5 def im_base(self): print("im_base()被调用了") class SubClass(BaseClass): ca_sub = 8 def im_sub(self): print("im_sub()被调用了") print(dir(SubClass))
▽ 重写
"""四、重写"""
"""
如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其进行重写从而提供自定义的实现,
重写的方式为:在子类中定义与父类中同名的属性或方法(包括装饰器)
子类重写父类的属性后,通过子类或其实例对象只能访问子类中重写后的属性,而无法再访问父类中
被重写的属性
子类重写父类的方法后,通过子类或其实例对象只能调用子类中重写后的方法,而无法再调用父类中
被重写的方法
父类中被重写的名为xxx的方法,在子类重写后的方法中可以通过super().xxx()进行通用
"""
class ParentClass(object):
ca = "ca(父类)"
def __init__(self):
print("__init__()被调用了(父类)")
def im(self):
print("im()被调用了(父类)")
@classmethod
def cm(cls):
print("cm()被调用了(父类)")
class ChildClass(ParentClass):
ca = "ca(子类)"
def __init__(self):
super().__init__()
print("__init__()被调用了(子类)")
def im(self):
super().im()
print("im()被调用了(子类)")
@classmethod
def cm(cls):
super().cm()
print("cm()被调用了(子类)")
cc = ChildClass()
print(ChildClass.ca) # ca(子类)
print(cc.ca) # ca(子类)
cc.im()
ChildClass.cm()
cc.cm()