首页 > 编程知识 正文

面向对象多态的理解,封装是面向对象的三大特征之一

时间:2023-05-03 20:23:21 阅读:111016 作者:639

文章目录8 .面向对象特征:封装、继承、多态8.1封装概念8.1.1封装方法8.2继承8.2.1基本概念8.2.2多继承机制继承顺序8.2.3父级方法8 如何构建父类调用8.2.4类

8 .面向对象特性:封装、继承、多态8.1封装8.1.1封装概念封装(Encapsulation ) :在设计类时,故意将一些属性和方法隐藏在类内部,使其成为现实禁止直接以类对象.属性名称(或类对象.方法名称)参数)的形式调用这些属性。这些隐藏属性和方法可以通过非隐藏的类方法间接操作。http://www.sinw 8.1.2方法类中的变量和函数公共(例如公共(public )属性)可避免外部对内部数据的影响,提高程序可维护性,避免用户对类中的属性或方法的不合理操作,并提高代码的重用性公共属性)公共)类变量和类函数可以在类的外部、类内部和子类中正常访问私有属性(private )。 类变量和类函数只能在此类内部使用。 不能在类的外部和子类中都使用python来实现类的封装方法。 默认情况下,python类中的变量和方法是公共的,名称前没有下划线_名称以双下划线__开头的变量_函数是私有变量_私有函数},而属性

注意: Python类还有以双下划线开头和结尾的类方法。 例如,类的构造函数__init__(self )等是在Python内部定义的,并用于Python内部调用。 如果要自己定义类的属性或类方法,请不要使用此格式。

封装作用双下划线开头的类属性或类方法。 其基础实现封装的原理是,通过秘密使用_类名__属性_方法(对象名称. _类名__属性)方法)名称,封装属性要创建功能与现有类类似的新类,必须在现有类中添加成员(属性和方法)并实现类的复用子类,才能创建新类。 实现继承的类的父类、继承的类(也称为基类、超类)的继承和继承是相对的子类。 这意味着子类是从父类派生的。 派生从父类派生子类http://www.Sina.com父类2 . #类定义部封装底层实现原理多继承机制:一个子类可以同时具有多个直接父类。 如果未明确指定类从哪个类继承,则缺省情况下继承object类。 object类是Python中所有类的父类。 子类具有父类的所有属性和方法。 包含私有(private )的属性或方法如果父类具有同名的属性和方法,则子类根据父类的先后顺序决定继承该属性和方法。 这意味着,较高父类的类方法将重写较低父类的同名类方法。 (自己写程序时,尽量不要使用多继承。 )8.2.2多继承机制的继承顺序继承顺序可分为深度优先和广度优先两种机制。

深度优先继承顺序: D - B - A - C广度优先继承顺序: D - B - C - A 8.2.3父类方法重写基本概念父类方法重写:继承的父类方法应用于子类该方法的子类重写方法名称必须与父类一样进行重写,两者都是继承搜索原则的第一个子类方法http://www.Sina.com/classa(:deffun ) self ) :passclassb ) a ) :deffun ) self ) :passcl=B )调用的a类方法fun (),self值a 如果需要通过手动传递来调用父类的构造函数方法的子类构造函数方法,则可以使用两种方法调用父类的构造函数方法: 类可以被视为独立的空间,可以在类外部调用其中的实例方法,就像调用普通函数一样,也可以使用其他注释类名(此方法也称为解除绑定方法(super ) )函数在许多继承中,此函数只能调用第一个直接父类的构造方法。 语法格式为super )._init_ () parm . (class a ) ) 3360def_ ) name ) 3360 self.name=namepass classb (3360 def _ isb ) value value () super )._init_ () name (super ) )方法b.__init_(self,value ) )解除绑定方法8.2.4类或实例

地添加实例方法,不能添加类方法和静态方法单个实例对象添加方法,不会影响该类的其它实例对象为类动态地添加方法,则所有的实例对象都可以使用 方法实例 class CLanguage: passdef info(self): # 定义了一个实例方法 pass@classmethod def info2(cls): # 定义了一个类方法 pass@staticmethoddef info3(): # 定义个静态方法 pass# 类可以动态添加以上 3 种方法,会影响所有实例对象CLanguage.info = infoCLanguage.info2 = info2CLanguage.info3 = info3clang = CLanguage() # 定义类的实例对象,clang 具有以上 3 种方法#类实例对象只能动态添加实例方法,不会影响其它实例对象clang1 = CLanguage()clang1.info = infoclang1.info(clang1) # 调用必须手动为 self 传值 __slots__ 作用即方法 限制为实例对象动态添加属性和方法法,无法限制动态地为类添加属性和方法__slots__ 属性值是一个元组,只有其中指定的元素,才可以作为动态添加的属性或者方法的名称__slots__ 限制的是其方法名,并不限制参数的个数__slots__ 属性对由该类派生出来的子类,也是不起作用的如下, 以 A 创建的实例对象,只能动态添加 name、add、info 这 3 个属性以及 name()、add() 和 info() 这 3 个方法 class A():__slots__ = ('name','add','info')pass 8.2.5 动态创建类 type() 函数 type(obj) : 查看某个变量(类对象)的具体类型type(name, bases, dict) : 用来创建类 name 表示类的名称bases 表示一个元组,其中存储的是该类的父类dict 表示一个字典,用于表示类内定义的属性或者方法 8.3 多态 含义 用一个函数名实现调用不同类中的不同内容(功能)的函数方法 特点 只关心对象的实例方法是否同名,不关心对象所属的类型对象所属的类之间,继承关系可有可无增加代码的外部调用灵活度,让代码更加通用,兼容性比较强多态是调用方法的技巧,不会影响到类的内部设计 使用示例 class CLanguage: def say(self): print("调用的是 Clanguage 类的say方法")class CPython(CLanguage): def say(self): print("调用的是 CPython 类的say方法")class CLinux(CLanguage): def say(self): print("调用的是 CLinux 类的say方法")class WhoSay: def say(self, who): who.say()a = WhoSay()a.say(CLanguage()) # 调用 CLanguage 类的 say() 方法a.say(CPython()) # 调用 CPython 类的 say() 方法a.say(CLinux()) # 调用 CLinux 类的 say() 方法

感谢阅读 若有错误 敬请见谅 !!!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。