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
  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/dong-/p/9373914.html
Copyright © 2011-2022 走看看