zoukankan      html  css  js  c++  java
  • Python面向对象,析构继承多态

    析构:

    def __del__(self):
      print("del..run...")
    r1 = Role("xx")
    del r1
    结果打印del..run...

    析构函数在实例被销毁的时候执行__del__

    做程序的收尾工作
    名字r1被删除后,垃圾回收机制会将对象清空
    就执行了__del__函数

    继承1

    对父类的功能进行扩展而无需重写

    * 多级继承,一般三层
    父--子--孙--..
    * 多重继承 class Teacher(SchoolMember,School)用的不多
    实现继承和接口继承
    实现不需要再写父类的方法,接口继承需要实现

    继承的写法

    class Person(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
            self.sex="normal"
        def talk(self):
            print("person is talking..")
    class BlackPerson(Person):
        def __init__(self,name,age,strength):
            Person.__init__(self,name,age)
            self.strength=strength
        def talk(self):
            print("blackperson is talking...")
        def walk(self):
            print("blackperson is walking...")
    class WhitePerson(Person):
        pass
    b = BlackPerson("bolt",30,"strong")
    print(b.name,b.age,b.sex,b.strength) # bolt 30 normal strong                    

    talk方法重写了,并添加了walk方法。

    子类继承父类的构造函数,构造的时候必须传参数

    要给子类加特殊的参数怎么办?不完全覆盖父类构造方法,先继承再重构
    可以看出不仅构造方法,其他方法也可以这样在父类方法基础上增加功能
    def __init__(self,name,age,strength):
      Person.__init__(self,name,age) #经典类写法
      super(Person,self).__init__(name,age) #新式类写法

    继承2

    __dict__:类的属性全放字典里


    ==================新式类和经典类===================统一用新式类
    新式类写法
    class Person(object):
    super...
    经典类写法
    class Person:
    ParentClass.__init__

    新式类跟经典类不光super的区别还有
    多继承时 继承顺序的区别
    现在主要写的是新式类

    例如  B继承A,C继承A,D继承BC

    新式类继承从左到右 BCA广度查询 ,
    Python3里不论新式类还是经典类继承时都是广度查询
    python2里经典类是深度,新式类是广度
    ===============================================================
    多态
    继承的目的————代码重用
    多态的目的————接口重用
    f = Father()
    s = Son()
    s = f
    Python中不直接支持多态,但可以间接实现

    class Animal:
        def __init__(self,name):
            self.name = name
        def talk(self):
            raise NotImplementedError("subclass must implement abstract method")
    a = Animal("aaa")
    a.talk() #报错NotImplementError
    
    class Cat(Animal):
        def talk(self):
            print("miao..")
    class Dog(Animal):
        def talk(self):
            print("wang...")
    d = Dog()
    c = Cat()

    不关注是哪个实例,用一个方法调用,
    Animal.talk(c) 装哪个对象,就用哪个对象的talk方法,只能按下面这种
    def animal_talk(obj):
      obj.talk()
    animal_talk(d)
    animal_talk(c)

  • 相关阅读:
    Linux安装Gradle
    MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)
    Websocket实现即时通讯
    Java线程池的使用
    Html5视频播放器-VideoJS+Audio标签实现视频,音频及字幕同步播放
    几种常用的认证机制
    Spring 接口参数加密传输
    Java 三种方式实现接口校验
    Spring AOP实现 Bean字段合法性校验
    RabbitMQ进程结构分析与性能调优
  • 原文地址:https://www.cnblogs.com/revo/p/7374105.html
Copyright © 2011-2022 走看看