python基本知识(七):面向对象,继承

‘‘‘面向对象编程:           1. POP, OOD, OOP           2. 类与实例           3. 继承: 单继承, 接口继承与多态, 多继承           4. 封装           5. 反射(获取信息, 命令分发, 动态加载模块)‘‘‘ # 综述

‘‘‘POP & OOD & OOP:              1. POP(Process Oriented Programming, 面向过程编程): 将一个过程分为几个子过程来完成              2. OOD(Object Oriented Design, 面向对象设计): 通过定义函数实现‘obj = data + method‘              3. OOP(Object Oriented Programming): 定义类 + OOD ‘‘‘ # POP & OOD & OOP# OODdef Object_func(attr1, attr2):    def init(attr1, attr2):        obj = {            ‘func1‘: func1,            ‘func2‘: func2,            ‘attr1‘: attr1,            ‘attr2‘: attr2        }        return obj    def func1(): pass    def func2(): pass    return init(attr1, attr2)

obj = Object_func(‘xzq‘, 12)obj[‘func1‘]()attr1 = obj[‘attr1‘]

‘‘‘类和实例:       1. 定义类           class ClassName(father):                class_v1 = v1               # 类属性                class_v2 = v2                def __init__(self,a,b):     # 实例属性                    self.a = a                    self.b = b                def func1(self): pass       # 实例方法, 所有实例共有

       2. 实例化          obj = ClassName(a,b)          实例化过程:  执行元类__call__()方法, 详细见MetaClass.py                     1.  调用Object.__new__(self)方法创建一个实例t                     2.  调用ClassName.__init__(t)方法初始化实例                     3.  返回初始化好的t, 赋值给obj                        

       3. 访问属性: 只能通过obj或ClassName访问             1) obj访问属性(data+method):                     obj.attr: 1> 搜索__init__()内部                              2> 然后在class内部搜索                              *当obj调用func(self,a,b)类内部方法时, 会自动传参self            

            2. Class访问属性(data+method):                   ClassName.attr: 1> 不能访问obj.attr, 即不会在__init__()中搜索, 直接在class内部搜索                                   * 当ClassName调用func(self,a,b)类方法时, 需要手动传入self, 也就是需要手动传入一个对象obj           

       4. 绑定属性:            1)obj绑定属性: 对象应该只有data, 不应该有自己独立的method                  1> 绑定data:   obj.data = value                  2> 绑定method:                                        def func(self): pass                                方式一:  obj.func = func                                        obj.func(obj)           # 调用时需要手动传入self, 因为该方法是属于当前obj的, 只有实例方法才会自动传入self                                方式二:  obj.func = types.MethodType(func,obj)                                        obj.func()              # 可正常调用                                  2)Class绑定属性                  1> 绑定data:  ClassName.data = value                  2> 绑定method:                               # 绑定实例方法                               def func(self): pass                               ClassName.func                  # 绑定后所有实例都可以使用, 包括绑定前生成的实例   

       5. 静态属性, 类方法, 静态方法                      1) 静态属性: 将method打包成data, 封装了内部细节                      @property                      def func(self):pass                      obj.func          # 访问时不再需要调用

          2) 类方法: 不要实例对象, 通过ClassName可直接访问的方法                    @classmethod                    def func(cls):pass     # 类方法只能访问类属性, 没有self                    ClassName.func()       # 通过类名直接调用

          3) 静态方法: 不能操作类属性, 实例属性, 但可以被class或obj直接调用                    @staticmethod                    def func():pass          ‘‘‘ # 类和实例

‘‘‘组合: 类A与类B显著不同, 类A是类B的组件          class Object_C(object):              def __init__(self,a,b):                 self.a = a                 self.b = b              ...          class Object_A(object):pass          class Object_B(object):pass

          a = Object_A()          b = Object_C()          C = Object_C(a,b)‘‘‘ # 组合

‘‘‘继承: 类和类之间大部分功能相同单继承:                 1. 定义             父类: class Father(object):                    def __init__(self,a,b):                        self.a = a                        self.b = b                    def func1(self):pass

           子类: class Child(Father)                1. 子类完全继承父类所有属性和方法                2. 子类可对父类方法进行重写                    * 重写__init__()方法时, 必须实现父类方法, 即添加新的实例属性时, 必须先确保父类实例属性                      def __init__(self,a,b,c):                         super(Child,self).__init__(a,b)                         self.c = c                3. 子类可部分继承父类方法, 对方法进行添加                      def func1_plus(self):                         super(Child,self).func1()     # 调用时, 这里会执行父类func1()                         # 新功能                4. 子类可定义自己的方法和属性         

    2. 子类访问属性:          # 引入描述符的情况见DesignClass.py          1) 子类对象obj访问属性              obj.attr(data+method): 1> 搜索子类__init__()                                     2> 搜索父类__init__()                                     3> 子类中搜索                                     4> 父类中搜索          2) 子类ClassName访问属性              ClassName.attr(data+method): 1> 子类中搜索                                                       2> 父类中搜索  ‘‘‘ # 单继承: 定义, 访问属性

‘‘‘接口继承: 归一化设计       1. 定义:            1) 接口不能实例化            2) 接口中的方法必须要实现

       2. 操作:           import abc           class Interface(metaclass=abc.ABCMeta)    # 定义接口               @abc.abstractmethod               def func(self): pass

           class Child(Interface):                   # 继承接口并重写所有方法              def func(self):                 # code 

多态: 不同对象调用相同方法, 结果不同                             ‘‘‘ # 接口继承: 归一化设计, 多态

‘‘‘  多继承:     1. 定义           class A():               def __init__(self)           class B():               def __init__(self)           class C(A,B):              def __init__(self):                 super(C,self).__init__(?)      # 传参按继承的就近原则

     2. 访问属性的搜索顺序:         经典类 class A(object): 深度优先, 会沿着第一条继承链搜到A         新式类 class A:    广度优先, 沿着第一条继承链搜索到A之前一个类, 然后最后一条链搜索到A

     3. 继承链存在 C.__mro__中, 是一个list, 查找时从左到右搜索到基类‘‘‘ # 多继承

‘‘‘封装:     1. 属性(data+method)的类型:         _var, _func(): 对外部不可见, 可继承         __var, __func(): 对外部不可见, 且不可继承

    2. 数据封装       1) 设置为__var       2) 通过静态属性访问和设置           @property           def var(self): return self.__var           @var.setter           def var(self,a): self.__var = a                  ‘‘‘ # 封装

‘‘‘获取类信息:      1. 获取对象类型:  type(obj)      2. 获取继承信息:  isinstance(obj,Class),  issubclass(Child, Father)      3. 获取所有属性:  dir(obj)          # 返回一个list, 包含所有属性, 不包括属性值                      cls/obj.__dict__  # 返回一个dict, 所有属性和值

      4. 反射: 操作实例属性或类属性             hasattr(obj/cls,‘attr‘)             getattr(obj/cls,‘attr‘,默认值[可选])             setattr(obj/cls,‘attr‘)             delattr(obj/cls,‘attr‘)用途:                 1. 操作属性                 2. 命令分发                 3. 动态运行方法                 e.g.                      if  hasattr(f1,‘get‘):                         getattr(f1,‘get‘)()                     else:                         # 运行其他代码    

动态加载模块: 通过字符串加载   1) m = __import__(‘module‘)                                             2) m = importlib.import_module(‘module‘)                                                                           ‘‘‘ # 反射(获取信息, 命令分发, 动态加载模块)

原文地址:https://www.cnblogs.com/lancelotxly/p/10837781.html

时间: 2024-10-03 01:12:55

python基本知识(七):面向对象,继承的相关文章

python学习笔记(七):面向对象编程、类

一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一个功能.举个例子,你要做饭,可以用电磁炉,也可以用煤气灶.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分别是面向过程编程和面向对象编程. 提到面向对象,就不得不提到另一种编程思想,面向过程:什么是面向过程呢,面向过程的思想是把一个项目.一件事情按照一定的顺

python学习笔记(七) - 面向对象高级编程

一. 为类动态添加属性和方法: 1. 动态给一个实例添加属性和方法: 给一个实例绑定的方法,对另一个实例是不起作用的. class Student(object): pass s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name def set_age(self, age): # 定义一个函数作为实例方法 self.age = age from types import MethodType s.set_age = MethodT

python函数知识七 闭包、装饰器一(入门)

21.闭包 闭包:在嵌套函数内,使用非全局变量(且不使用本层变量) 闭包的作用:1.保证数据的安全性(纯洁度).2.装饰器使用 .__closure__判断是否是闭包 def func(): a = 1 def foo(): print(a) return foo ret = func() ret() #例子 def func(): avg_lst = [] def foo(pirce): avg_lst.append(pirce) avg = sum(avg_lst) / len(avg_ls

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

Python基础知识详解 从入门到精通(七)类与对象

本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详解 从入门到精通(三)语法与函数Python基础知识详解 从入门到精通(四)列表.元组.字典.集合Python基础知识详解 从入门到精通(五)模块管理Python基础知识详解 从入门到精通(六)文件操作PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为此

Python 面向对象继承

一 什么是面向对象的继承 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A"继承自"另一个类别B,就把这个A称为"B的子类别",而把B称为"A的父类别"也可以称"B是A的超类".继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码.在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功

python之旅:面向对象之继承与派生

一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 一个类继承另一个类时,他将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法. python中类的继承分为

python 基础知识(一)

                                       python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个叫Monty Python的喜剧团体的爱好者.Python是从ABC发展起来,主要受到了Modula-3(另一种相当

Python基础知识两部曲:二

如果没有看基础部分第一章,请前往Python基础知识两部曲:一 8.函数 1.定义函数: 使用关键字def来告诉python你要定义一个函数 接着指出函数名:如下面函数名是--greet_user ()是必须带上的,这里可以可以传递一些参数,也可以不传 以:结尾,且与后面所有的缩进构成了函数体 调用函数直接写上函数名,如果有参数记得带上参数 1. 无参数的函数: def greet_user(): """显示简单的函数体""" print(&qu