zoukankan      html  css  js  c++  java
  • python进阶(五)~~~多态和属性访问

    面向对象三大特征:

    封装:将数据和方法放在一个类中,构成封装

    继承:子类继承父类属性和方法,可多继承

    多态:一个事物有多种形态,一个抽象类有多个子类,不同的子类对象调用相同的方法,产生不同的执行结果。多态可以增加代码的灵活度。是基于类的继承。

    class Animal:
        def run(self):
            raise AttributeError('子类必须实现这个方法')
     
    class Pig(Animal):
        def run(self):
            print('pig is walking')
     
    class Dog(Animal):
        def run(self):
            print('dog is running')
     
    def func(obj):  # python的函数参数 无任何类型限制,可以是类本身,也可以是类的对象
        obj.run()
    
    pig1=Pig()
    d1=Dog()
     
    func(pig1)
    func(d1)

    多态的意义:开放封闭原则

      对于一个变量,我们只需要知道它的Base类型,无需知道它的子类型,就可以放心的调用相同的方法quack();

      当需要新增功能时,只需新增一个Base的子类实现quack()方法,就可以在原基础上扩展功能,即开放封闭原则:

            对扩展开放:允许新增一个Base的子类;

            对修改封闭:不要修改Base依赖类型的quack()函数;

    鸭子类型

    鸭子类型关注点在对象的行为,而不是类型。不要求严格的继承体系。只要行为相似(内部实现相同的方法),即可视为鸭子类型。

    class Duck:
        def __init__(self, name):
            self.name = name
     
        def quack(self):
            print("gua gua")
     
    class Man:
        def __init__(self, name):
            self.name = name
     
        def quack(self):
            print("女王大人")
     
    def do_quack(ducker):
        ducker.quack()
     
    if __name__ == '__main__':
        d = Duck('duck')
        m = Man('man')
        do_quack(d)
        do_quack(m)

    数据类型和自省:

    1. 私有属性:类里面定义的属性分为两种:公有属性和私有属性

    2. 私有属性定义:

      以单下划线开头_attr :类外部可以直接调用

      以双下划线开头的属性__attr:类外部不能直接调用,被改名了,需要用 _类名__attr 访问;

    class People:
     
        # 初始化参数
        def __init__(self, name):
            self.name = name
            self.__age = 18  # 在需要设置的属性或方法前加双下划线,即设置私有属性或私有方法
     
        def display(self):
            print('%s的年龄是%d' % (self.name, self.__age))
     
    XiaoAi = People('小爱同学')
     
    # 此时age属性为私有属性,不能进行外部访问,否则会报错
    # print(XiaoAi.__age)
     
    # 以单下划线+类名的显示,可以访问私有属性
    print(XiaoAi._People__age)
     
    XiaoAi.display()

    3. python不能实现真正的私有属性,但通过下划线开头,可以得到伪私有属性。大部分python代码遵循规则:以下划线开头的属性为私有属性,被视为非公开的API的一部分,仅用于实现细节。

    4. __dict__: 类.__dict__:返回该类 属性、方法的字典;实例.__dict__:返回实例的 属性、方法字典;实例.方法.__dict__:返回方法的 属性、方法字典

        __doc__: 类.__doc__:返回该类的注释说明;实例.方法.__doc__:返回方法的注释说明 ;模块.__doc__:返回py文件模块的注释说明文档

        __slots__:类的属性范围锁定,仅允许绑定__slots__= [ ]列表中已有的属性,可节约内存,提高性能。

    自定义属性访问

    内置函数:

    getattr: 获取属性 ,触发魔术方法 object.__getattr__()

    setattr: 设置属性,触发魔术方法 object.__setattr__()

    delattr: 删除属性,触发魔术方法 object.__delattr__()

    1. object.__getattr__:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发。

    2.object.__getattrible__: 访问属性的时候,第一时间触发该方法去找属性。如果没找到触发AttrError。当我们去访问一个不存在的属性时,首先会触发__getattribute__,然后才会触发__getattr__ 
    如果属性存在,就返回这个属性值,如果没有就报 AttrError

    3.object.__setattr__:设置属性

    4.object.__delattr__:删除属性

  • 相关阅读:
    jenkins:用jenkins通过ssh部署jar包到远程linux机器(jdk 15 / jenkins 2.257)
    linux(centos8):安装java jdk 15 (java 15)
    38. 外观数列 迭代
    58. 最后一个单词的长度
    kmp字符串匹配
    单词规律
    1502. 判断能否形成等差数列
    1496. 判断路径是否相交
    1475. 商品折扣后的最终价格
    一维数组的动态和
  • 原文地址:https://www.cnblogs.com/qingyuu/p/12255571.html
Copyright © 2011-2022 走看看