• 面向对象进阶小结


    面向对象进阶小结

    一、面向对象进阶小结

    面向对象最本质解决的问题就是:提供可扩展性

    类与对象:程序中必须现有类,再有对象

    类中有属性,有方法

    绑定方法:定义在类内部,没有装饰器装饰的方法都是对象的绑定方法,需要对象来调用,对象调用的时候,会把自身传入

    1.1 类的继承

    继承父类,则会有父类的所有属性和方法

    class ParentClass1():
        pass
        
    class ParentClass2():
        pass
    
    class SubClass(ParentClass1,ParentClass2):
        pass
    

    1.2 类的派生

    继承父类的同时自己有init,然后也需要父类的init

    class ParentClass1():
        def __init__(self,name):
            pass
        
    
    class SubClass(ParentClass):
        def __init__(self,age):
            # 1. ParentClass1.__init__(self,name)
            # 2. super(SubClass,self).__init__(name)
            self.age = age  
    

    指名道姓,使用类名

    super().方法/属性 super严格按照mro列表查找,super(类名,对象)python2/3

    1.3 类的组合

    类对象可以引用/当做参数传入/当做返回值/当做容器元素,类似于函数对象

    class ParentClass1():
        count = 0
        def __init__(self,name):
            pass
    
    class SubClass(ParentClass):
        def __init__(self,age):
            self.age = age  
    
    pc = ParentClass1()
    sc = SubClass()
    
    sc.parent_class = pc  # 组合
    sc.parent_class.count  # 0
    

    1.4 菱形继承问题

    新式类:继承object的类,python3中全是新式类

    经典类:没有继承object的类,只有python2中有

    在菱形继承的时候,新式类是广度优先(老祖宗最后找);经典类深度优先(一路找到底,再找旁边的)

    1.5 多态与多态性

    多态:一种事物的多种形态,动物-->人/猪/狗

    多态性:同一个函数调用,可以实现不同的功能

    # 多态
    import abc
    
    class Animal(metaclass=abc.ABCmeta):
        @abc.abstractmethod
        def eat():
            print('eat')
    
    class People(Animal):
        def eat():
            pass
    
    class Pig(Animal):
        def eat():
            pass
        def run():
            pass
    
    class Dog(Animal):  # 报错
        def run():
            pass
            
    # 多态性
    peo = People()
    peo.eat()
    peo1 = People()
    peo1.eat()
    pig = Pig()
    pig.eat()
    
    def func(obj):
        obj.eat()
    
    class Cat(Animal):
        def eat():
            pass
    cat = Cat()
    
    func(cat)
    

    鸭子类型:只要长得像鸭子,叫的像鸭子,游泳像鸭子,就是鸭子.

    控制子类必须实现父类的方法,abc模块,和通过异常

    1.6 类的封装

    隐藏属性,只有类内部可以访问,类外部不可以访问

    封装
    组合也是属于封装,
    隐藏属性和方法
    通过__两个下划线,放在属性或者方法的前面,能把属性和方法隐藏
    隐藏属性的目的,就是为安全
    隐藏方法的目的就是为了隔离复杂性

    class Foo():
        __count = 0 
        
        def get_count(self):
            return self.__count
            
    f = Foo()
    f.__count  # 报错
    f._Foo__count # 不能这样做
    

    1.7 类的property特性

    把方法变成属性引用

    propetory:把方法包装成数据属性
    修改 @方法名.setter
    删除 @方法名.deleter

    class People():
        def __init__(self,height,weight):
            self.height = height
            self.weight = weight
        
        @property
        def bmi(self):
            return weight/(height**2)
            
        @bmi.setter
        def bmi(self,value)
            print('setter')
            
        @bmi.deleter
        def bmi(self):
            print('delter')
    
    peo = People
    peo.bmi
    
    

    1.8 类与对象的绑定方法和非绑定方法

    没有任何装饰器装饰的方法就是对象的绑定方法, 类能调用, 但是必须得传参给self

    被 @classmethod 装饰器装饰的方法是类的绑定方法,参数写成cls, cls是类本身, 对象也能调用, 参数cls还是类本身

    被 @staticmethod 装饰器装饰的方法就是非绑定方法, 就是一个普通的函数

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    Delphi 日期函数的单元 DateUtils
    学习官方示例 SysUtils.DecodeDate、DecodeTime
    msp430的常量可以这样定义
    学习官方示例 SysUtils.EncodeDate、EncodeTime、StrToDate、StrToTime、StrToDateTime
    Delphi中Format与FormatDateTime函数详解
    csdn太慢了搬到园子里来
    .net 2.0 真的能与1.1 安全正确地运行在同一台电脑上吗?
    照着这些做,生活自然很开心
    【转】SQL中取当前记录的ID>SCOPE_IDENTITY()
    [转]Windows XP Service Pack 2中弹出窗口拦截器的研究
  • 原文地址:https://www.cnblogs.com/randysun/p/12250342.html
Copyright © 2020-2023  润新知