zoukankan      html  css  js  c++  java
  • python 面对对象三大特性

    . 继承

      1. 单继承

        继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类.

        面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.

        如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现

        语法:

          class 派生类名(基类名)

            .............

        子类以及子类实例化的对象,可以访问父类的任何方法或者变量

        类名可以访问父类所有内容

        子类的实例化对象也可以访问父类的所有内容

    class Animal:
    
        def __init__(self, name, sex, age):
            self.name = name
            self.sex = sex
            self.age = age
    
        def eat(self,a1):
            print('%s吃%s' % (self.name,a1))
    
        def drink(self):
            print('%s喝东西' % (self.name))
    
    
    class Cat(Animal):
    
        def miaow(self):
            print('喵喵叫')
        # def eat(self):  # 若子类创建了和父类中相同的方法,只执行自己类中的方法
        #     print(666)
    
    class Brid(Animal):
    
        def __init__(self, name,sex,age,wing): # self b1对象 name '鹦鹉',sex '公',age 20,  wing '绿翅膀'
            '''
            self=b1对象
            name='鹦鹉'
            sex='公'
            age= 20,
            wing='绿翅膀'
            '''
            # Animal.__init__(self, name, sex, age)
            super().__init__(name,sex,age)  #  super(Brid,self).__init__(name,sex,age)    即想执行子类的方法,也想执行父类的方法
            self.wing = wing
        def bark (self):
            print('嗷嗷叫')
    
        def eat(self,argv):
            super().eat(argv)
            print('鸟吃虫子...')
    
    class Chook(Animal):
        def crow(self):
            print('大爷laiwanya')
    
    b1 = Brid('鹦鹉','',20,'绿翅膀')
    b1.eat('金蝉')

        如果既想执行子类的方法,有想执行父类的方法,一共有两种方法:

          1. 父类名.__方法名__(self,父类属性)

          2. super().__方法名__(父类的属性)

      2. 多继承

        多继承的查询顺序以经典类或者新式类区分:

          新式类:遵循广式优先查询  一条路走到倒数第二级,判断是否有其他路可以走到终点,如果有则返回走其他路,没有直接到终点

          经典类:遵循深度优先查询  一条路走到终点  

        其中单继承中,经典类或者新式类的查询方式都是一样的

    二. 封装

      封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容.

      封装就是把类中的属性和方法定义为私有的,方法就是在属性名或方法名前加双下划线,而一旦这样定义了属性或方法名后,python会自动将其转换为_类名__属性名(方法名)的格式,在类的内部调用还是用双下划线加属性名或方法名,在类的外部调用就要用_类名__属性名(方法名)。父类的私有属性和方法,子类无法对其进行修改

      所以,在使用面向对象的封装特性时,需要:

        将内容封装到某处

        从某处调用被封装的内容

    # 广义的封装: 实例化一个对象,给对象空间封装一些属性.
    # 狭义的封装: 私有制.
    
    # 私有成员:私有静态字段,私有方法,私有对象属性
    
    # 私有静态字段
    
    class B:
        __money = 100000
    
    class A(B):
        name = 'xxx'
        __age = 1000
    
        def func(self):
            print(self.__age)
            print(A.__age)    # 对于私有静态字段,类的内部可以访问.
            print('func....')
        def func1(self):
            print(self.__money)
            print(A.__money)
    a1 = A()
    print(a1.name)
    print(A.name)
    
    print(a1.__age)  # 通过实例化对象不能访问私有静态字段
    print(A.__age)  # 通过类名也不能访问私有静态字段
    # 对于私有静态字段,类的外部不能访问.

      总结:

        对于私有静态字段,只有在本类内部才可以访问. 在类的外部,派生类均不可以访问

    三. 多态

       多态就是不同的对象可以调用相同的方法然后得到不同的结果,有点类似接口类的感觉,在python中处处体现着多态,比如不管你是列表还是字符串还是数字都可以使用+和*。

      多态: 同一个对象的多种形态

        即使子类继承了一个或多个父类, 依然可以执行自己本类中的方法

      python 中有鸭子类型:

        鸭子类型就是,不同的类中含有相同的方法(函数),统称这些类为鸭子

    class Str:
        def index(self):
            pass
     
    class List:
        def index(self):
            pass
     
    class Tuple:
        def index(self):
            pass
  • 相关阅读:
    java 集合类说明与区别
    JAVA集合LIST MAP SET详解
    ThinkPHP文件上传
    ThinkPHP表单操作(未加验证)
    常用的正则表达式大全
    ThinkPHP模板替换
    ThinkPHP包含文件
    example_UEditor富文本编辑器
    ThinkPHP快捷方法汇总(随时添加)
    页面编码统一(转载)
  • 原文地址:https://www.cnblogs.com/dong-/p/9373914.html
Copyright © 2011-2022 走看看