【python 07】 面向对象编程

Python面向对象编程
    首先明白面向过程和面向对象概念
    面向过程:根据业务逻辑从上到下书写代码
    面向对象:将数据与函数绑定在一起,进行封装,加速开发过程,减少重复代码的书写
    
    类:具有相同或相似属性和行为的事物的集合,类是抽象的
    对象:在现实生活中真实存在的物体,看得见摸得到
    
    属性:事物的特征信息,静态数据
    方法:事物能进行的活动,能对静态数据做的操作,是动态的

封装

    封装:

        1.把数据和方法组合到一起,写到类中;

        2.把类中不需要对外暴露的属性和方法隐藏起来; 

        3.把代码块写到方法中,当别人调用这个方法时,只需要知道这个方法的作用(功能),不需要知道具体的实现细节。

    封装的好处:

        对外暴露功能,隐藏了功能实现的细节,可以提高开发效率

    几个重要的魔法方法:

    __new__方法    
            这个方法是用来创建空白对象的
            当创建对象时,python解释器会自动调用这个方法创建一个空白对象,并返回该空白对象

            通过调用object类中的__new__方法创建对象,创建出来的是一个空白对象然后返回
            def __new__(cls,*args,**kwargs):  # *args用来接收创建对象时传来的参数,后面会解包传给__init__方法
                return super().__new__(cls)  # cls是来接受类对象的,告诉解释器创建那个类的空白对象
                #return object().__new__(cls) 
                
            def __init__(self,name,age):
                self.name = name
                self.age = age

    __init__构造函数  
                    在对象创建之后,解释器会立即调用这个方法,会把对象传递给self,
                    把Student("王二",30,"男")中的三个参数值传递给new_name,new_age,new_gender。

    __str__ 
            必须返回一个字符串,常用来返回对象的属性和属性值拼接的一个字符串
            两种情况下会调用__str__方法:
                1.打印对象时,解释器会自动调用str方法,得到一个字符串
                2.将对象转成字符串时,也会得到一个字符串

    __del__ 析构函数  
            在对象即将被销毁的时候(对象的引用为0),解释器自动调用这个方法
            作用:
                不是删除对象,__del__并没有删除对象的功能,是用来交代被销毁前的要做的事。

    调用对象的方法时,该方法的参数可以是另一个类的对象,可以直接调用另一个对象的属性和方法,十分方便有用。

继承

    继承:子类继承父类,子类一旦继承父类,就拥有了父类中非私有的属性和方法。

    继承的好处:

        1.扩展子类的功能

        2.减少重复代码的书写,提高代码的复用性

    私有属性和私有方法 
    私有属性:self.__属性名 = 属性值
    私有方法:

        def __方法名(形参):

            pass
    子类不能继承父类的私有属性和私有方法,子类对象和父类对象不能在类外使用私有,私有只能在类内使用。
    若想在类外使用私有,可在类内定义公共方法获取或修改私有。
    python其实不存在绝对的私有,更多关于私有的知识后续再来补充。

    python中继承可以分为:

    单继承:父类继承的是object类,子类继承父类。

    多继承:同时继承多个父类,括号内的第一个父类为直接父类,super就是直接父类中的标记。

    多层继承:一层一层的继承,父类继承父类的父类,子类继承父类。

     子类可以重写父类方法,若想使用被重写的父类方法,有三种方式:
         1.父类名.方法名(self,形参值的列表)  # self 的作用是将子类传入,告诉父类是哪个子类在调用父类的方法
          2.super(子类名,self).方法名(形参值的列表)  
          3.super().方法名(形参值的列表) # super()其实代表的就是直接父类,即使用直接父类中的方法

    实例属性
         对象的属性,实例属性和实例属性值存储在实例对象中
    如何访问修改实例属性:
        1.类内:
            对象名.实例属性名 = 新值   # self.name = new
        2.类外:
            对象名.实例属性名 = 新值   # s1.name =new

    实例方法
         对象的方法,实例方法存储在类对象中
    如何调用实例方法:
        1.类内:
            对象名.实例方法名  self.study()
        2.类外:
            对象名.实例方法名  s1.study()

类对象
        class A():
            类体
        称为一个类对象,type类包括所有的类对象,type类被叫做类的类

类属性
        所有的对象共享公用的属性,这个属性不专属于某一个对象,是所有对象共用的
        类似C++里的静态成员变量。
    如何访问类属性:
        类内:
            1.类名.类属性名
            2.对象名.类属性名   # self.类属性名
        类外:
            1.类名.类属性名
            2.对象名.类属性名  # s1.类属性名

    如何修改类属性名:
            类名.类属性名 = 修改后的值
            不能通过 对象名.类属性名 = 修改后的值  ,这是给对象添加实例属性

类方法    

class Student(object):
    @classmethod
    def close(cls,name):
        print(cls)
        print(name)
        cls.test()
    @classmethod
    def test(cls)
        print("test")


        方法中的cls参数值接收的是当前的类对象,就是Student
        在类方法中无法直接调用实例属性和实例方法,因为无法得到self

    如何调用类方法:
        类内:
            1.self.close("王五")  # 对象名.类方法名(实参)
            2.Student.close("王五")   # 类名.类方法名(实参)
        类外:
            1.s1.close("王五")  # 对象名.类方法名(实参)
            2.Student.close("王五")  # 类名.类方法名(实参)

    静态方法    

@staticmethod
def show()
    print(Student.air_condition)
    Student.close("王五")

    静态方法,可没有形参,根据需求定。

    如何调用静态方法:
            1.类内
                1.对象名.静态方法名
                2.类名.静态方法名

            2.类外:
                1.对象名.静态方法名
                2.类名.静态方法名
    单例模式
        单例模式是一种设计模式,为了解决某一类问题而设计出来的一个方案
        单例:
            在系统中这个类只有一个实例对象,不管创建对象创建了几次,在系统中只有一个对象

多态

    python的多态是鸭子类型:

        Python 的多态就是 弱化类型,重点在于对象参数是否有指定的属性和方法
        如果有就认为合适,而不关心对象的类型是否正确 。     

异常的概述
    异常:执行程序时程序抛出的红色信息
        异常类是用来描述某一类异常的

        程序中出现的异常需要处理,不然会影响后续代码的执行

    异常的传递 :向上抛出异常

    解释器处理异常的原理        
        1.程序执行到报错代码时,解释器根据错误原因,查找相对应的异常类,
         然后创建一个异常类对象,最后把异常对象向外抛出
         2.这个异常对象抛给了代码的调用者,谁调用了这段代码,解释器就会把异常对象抛给谁,调用者来处理异常。
         3.如果调用者是解释器自己,需要解释器自己来处理异常
         4.解释器如何处理异常:    
                   把异常信息打印到来控制台
                    终止程序的运行

    异常的定义格式
        处理异常的格式:
            try:
                可能会出现异常的代码块
            except:
                处理异常的代码块
            finally:
                print("有无异常,该语句都要执行")

    自定义异常  
        自定义异常类:
            1.继承父类
            2.重写__init__方法

    


class AgeError(Exception):  # 继承父类
    def __init__(self,msg):  # 重写__init__方法
        self.msg = msg
 
class Student:
    def __init__(self,name,age):
        self.name = name
        self.__age = age
 
    def set_age(self,age):
        if 0<age<150:
            self.__age = age
        else:
            raise AgeError("年龄必须在0到150之间...")  # 抛出年龄错误的异常
 
s = Student("王二",15)
 
try:
    s.set_age(200)
except AgeError as e:
    print(e)
 

猜你喜欢

转载自blog.csdn.net/w18306890492/article/details/82414626