python基础之小知识点----面向对象三大特征(1)

 学习过程随意记录的小知识点

一、基础篇

1.在Python中,在函数内部针对参数 赋值 不会影响外部参数
2.在Python中,在函数内部使用 方法 修改可变参数会影响外部参数
3.在列表中使用 = (等号),本质上是调用 extend 方法


缺省参数:
1.指定函数的缺省参数---》 在参数后使用 赋值 语句,可以指定参数的缺省值
    必须保证 带有默认值得缺省参数 在参数列表末尾

2.带有多个缺省参数的函数:
    在调用函数时,如果有多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关系(参考sort方法)

3.多值参数:
    3.1 函数要处理的参数不确定是 ,使用多值参数
    3.2 两种:
        3.2.1 参数名前增加一个  *  可以接收 元组
        3.2.2 参数名前增加两个  *  可以接收 字典
    3.3 默认多值参数名:
        元组: *args
        列表: *kwargs

4.元组和字典的拆包:
    在调用带有多值参数的函数时,如果希望:
        将元组变量,直接传递给 args
        将字典变量,直接传递给 kwargs
    就可以使用拆包,简化参数的传递,方法:
        在元组变量前,增加;一个 *
        在字典变量前,增加;两个 *


二、面向对象篇

1.类是模板,对象是根据 类 这个模板创建出来的,应该先有类,再有对象
2.类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可以少

3.利用好 dir() 这个函数,可以查看 类型或数据含有的 方法

4.在类中定义函数时,第一个参数必须是 self
    在类封装的方法 内部,self就表示当前调用方法的对象自己
    哪一个对象调用的方法,self就是哪一个对象的引用,及self是引用这个对象的内存地址,self引用的地址和这个对象的地址是一样的
    使用self:只需在self后面加上 .属性名(行为名) 即可

5.给对象增加属性:
    不推荐,因为:对象属性的封装应该封装在类的内部
    只需要在 类的外部的代码 中直接通过 .属性名 设置一个属性即可
    使用这种方法添加的属性,并不能给 类 添加属性,只能给当前这个对象添加属性

6.在初始化方法内部定义属性:----简化对象的创建
    作用:1.为对象在内存中分配空间---创建对象     2.为 对象 的属性 设置初始值---初始化方法(__init__ )
    在__init__ 方法内部使用 self.属性名 = 属性的初始值  就可以定义属性
    定义属性之后,在使用 xx类 创建的对象,都会拥有该属性

  对初始化方法的改造:初始化的同事设置初始值:
     __init__ 方法中定义要增加形参(参数)
     在__init__ 方法内部使用 self.属性 = 形参  接收外部传递的参数
     在创建对象时,使用 类名(属性1,属性2...) 调用

7. __del__   和  __str__  方法

8.私有方法:只能在对象的内部被使用,而不在外边被访问到
    私有属性和方法,都不允许在外界直接访问
       连 print(对象.属性或方法) 都不行,报错

9.没有整整真正意义的私有:
    不推荐,因为既然是私有的了,那就要保证私有的隐私性
    方式:在 名称 前面加上 _类名 ==》 _类名__名称


三、继承篇

面向对象三大特性:
    1.【封装】 根据职责将 属性 和 方法 封装到一个抽象的类中
    2.【继承】 实现代码的重用,相同的代码不再需要重写
    3.【多态】 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度

(1)、单继承

1.继承的概念、语法和特点
   1.1 概念:子类拥有父类的所有方法和属性
    
   1.2 语法:
        class 类名(父类名):
            pass
    
       · 子类 继承自父类,可以直接享受父类中已经封装好的方法,不需要再次开发
       · 子类中应该根据职责,封装子类特有的属性和方法

    1.3 专业术语
        · xx类是xx类的子类, xx类是xx类的父类, xx类从xx类继承
        · xx类是xx类的派生类, xx类是xx类的基类, xx类从xx类派生

    
    1.4 继承的传递性:
        · C类从B类继承,B类又从A类继承
        · 那么C 了就具有B类和A类的所有属性和方法
        
         " 子类拥有父类以及父类的父类的所有属性和方法 "


2.方法的重写    (父类的方法不能满足子类的需求,这就要对方法进行重写了)
    
    重写父类方法的两种情况:
        1.覆盖父类的方法
        2.对父类方法进行扩展

    1.1 覆盖父类的方法:
        ·父类的方法实现和子类的方法实现完全不同,就可用覆盖方法,在子类中重新编写父类的方法实现(就相当于在子类中定义了 一个和父类同名的方法并且实现)
        ·覆盖之后,运行程序时,只会调用子类中重写的方法,不会再调用父类中封装的方法了
                  

    2.1 扩展:
        ·(场景)子类的方法实现中包含父类对的方法实现(父类原本封装的方法实现是子类方法的一部分)
        ·方法:
            在子类中重写父类的方法
            在需要的位置使用 super().父类方法 来调用父类方法的执行
            代码其他的位置针对之类的需要,编写子类特有的代码实现

        ·代码实现::
        class Dog:
            def fly(self):
                print("我会飞:)

        class Xiaohei(Gog):
             def fly(self):
                print("我飞的很快:)
                super().fly()


3.父类的私有属性是方法:

    ·子类对象不能在自己的方法内部,直接访问父类的私有属性和方法

    ·子类对象可以通过父类的 公共方法 间接访问到私有属性和私有方法

        私有属性、方法是对象的隐私,不对外公开,外界及子类不能直接访问

        私有属性、方法通常用于做一下内部的事情


(2)、多继承

1.概念:

    ·子类可以拥有多个父类,并且具有所有父类的属性和方法
        例如:孩子会继承自己父亲和母亲的特征

2.语法:

    class 子类名(父类名1, 父类名2.。。):

        pass 

3.如果父类之间存在相同名字的属性或者方法,就应该避免使用多继承

4.内置方法:

    __mro__
        
        MRO 是 method resolution order, 主要有于 在 多继承时判断 方法、属性的调用路径(顺序)

    使用:
    
        print(类名.__mro__)



四、多态篇

    ----不同的 子类对象 调用相同的父类方法,产生不同的执行结果

    ·多态可以增加代码的灵活度
    ·以继承和重写父类方法为前提
    ·是调用方法的技巧,不会影响到类的内部设计 




五、类对象        ---类是一个特殊的对象

    在python中,一切都是对象
    
        · class AAA:    定义的类属于 类对象
        · obj1 = AAA()   属于实例对象

    在程序运行时,类同样会被加载到内存

    在python中,类是一个特殊的对象 --- 类对象

    在程序运行时,类对象在内存中只有一份,使用一个类可以创建很多个对象实例

    除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法
        ·类属性
        ·类方法

    通过 类名. 的方式可以访问类的属性 或者 调用类的方法


(1)、类属性

1.概念和使用

    ·类属性 就是给 类对象 中定义的属性
    ·通常用来记录与这个类相关的特征
    · 类属性 不会用于记录 具体对象的特征
        
    使用 = 赋值语句在 class 关键字下方可以定义 类属性

    类名.类属性 --- 访问方法


(2)、类方法

    · 类方法 就是针对 类对象 定义的方法

        在类方法内部可以直接访问类属性或者调用其他的类方法

    ·语法:
        
        @classmethod
        def 类方法名(cls):
            pass

            
            `类方法需要用 修饰器 @classmethod 来表识,告诉解释器这是一个类方法

            ·类方法的第一个参数应该是 cls

                由哪一个类调用的方法,方法内部的 cls 就是那一个类的引用

                这个参数和实例方法的第一个参数self类似

                提示使用其他名称也可以,不过习惯使用 cls


            ·通过 类名. 调用类方法,调用方法时,不需要传递 cls 参数

            ·在方法内部:   
                 
                可以通过 cls. 访问类的 属性

                也可以通过 cls. 调用其他的类方法   



六、静态方法
    
    如果需要在类中封装一个方法,且这个方法:
        既不需要访问实例属性或者实例方法
        也不需要访问类属性或者类方法

    这个时候,就可以把这个方法封装成一个静态方法

    语法:
        
        @staticmethod
        def 静态方法名():                    # 不需要参数
            print("小鸟要飞")

            
            静态方法需要使用 @staticmethod 修饰器来表识,告诉解释器这是一个静态方法

            通过 类名.  调用静态方法




七、
__new__    方法
















猜你喜欢

转载自blog.csdn.net/qq_42098517/article/details/82949423