python入门:类

53 阅读4分钟

相关概念

类:用class关键字定义的拥有一类属性和方法的模板,类似C语言的结构体,可以看作一种类型
对象:类的具体表现,具有类的属性和方法
实例:具体的对象
属性:对象具有的特征,本质是类中定义的变量
方法:对象具有的行为,本质是类中定义的函数

类的定义

class 类名:
    变量名=数据 #类中定义变量
    def 函数名(self, 参数): #类中定义函数
        函数体

self表示引入实例本身作为参数,必须作为类定义函数的第一个形参,但调用时无需对应的实参;在函数体中可用 self.变量 进行实例属性的调用和修改

类的操作

实例名=类名() 创建实例,实例名.变量名 调用实例中的变量,实例名.函数名(参数) 调用实例中的函数
类名.变量名 对类的属性进行调用,类名.变量名=数据 对类的属性进行覆盖或增加,del 类名.变量名 删除对应类的属性
实例.变量=数据 动态给实例添加实例变量,类.函数=函数名 动态给类添加函数
限制实例可添加的变量:

class 类:
    __slot__=(''变量1'', ''变量2'')

类的初始化

class 类名:
    def __init__(self, 参数):
        初始化属性

在创建实例时会自动调用__init__函数,可以在__init__内部用参数创建和定义实例属性,常用于初始化;在非__init__函数中定义的实例属性需要先调用对应函数后才会完成定义;实例属性属于每个实例,不可被类调用和修改
实例=类名(参数) 进行创建,参数数量与init所需除self外的参数一致

析构函数

def __del__(self):
    实例被销毁时执行的函数
def __str__(self): 
    必须返回一个字符串,定义str方法后打印实例时输出str的返回值
def__repr__(self):
    必须返回一个字符串,定义repr方法后Debug打印实例时输出repr的返回值

编程逻辑

面向对象编程:为每个对象设计一系列函数,包装在一个类中进行调用 面向过程编程:为每个流环节设计函数,依距流程进行调用

不创建实例直接调用类函数的方法

静态方法:在类中第一行使用@staticmethod装饰,函数参数中去掉self,调用时直接用类名.函数(),在函数不需要参数时可使用
类方法:使用@classmethod装饰,一个@classmethod只能装饰一个函数,其形参self改为cls,在函数体中用cls代替self自指,可用return cls()输出一个实例;可用于接收参数与__init__参数间需要转换的时候,__init__需要默认赋值;调用时用类名.函数(),可以传入参数

继承

继承:定义类的时候可以用 class 子类(父类): 继承另一个类,子类会继承父类的所有功能,对父类中定义的类变量和函数子类可以直接用子类.变量子类.函数()进行使用
继承重写:在子类中定义与父类同名的函数可以对对应函数进行覆盖
父类扩展:子类中重写函数时可以在函数体中用 父类.函数()super().函数() ,保留父类函数体仅进行扩展,有点像装饰器
多态:以类名作为其他函数的形参时,实参可以传入该类的实例,也可以传入其子类的实例,子类可以扩展功能同时适配与父类相关的函数,无需改变之前与其父类关联的一切参数
基类:object类中包含类中的一些隐性方法,定义类时默认被继承
__new__方法:创建实例时第一个被调用的函数,默认返回值是创建类的实例,常用是在重写__new__函数中用 return object.__new__(cls) 返回当前类的实例,与__init__的区别是init是实例被创建后调用,new则在实例创建之前

单例模式

单例模式:类只能创造一个实例,本质是创造实例时指向同一个地址,可以节省空间
创建单例模式:核心思路是设置类变量记录第一次创建的实例,创建新实例时返回该变量
__new__方法创建:

class test:
    ins=None
    def __new__(cls, *args, **kwargs):
        if cls.ins is None:
            cls.ins=object.__new__(cls)
        return cls.ins
t=test() #创建

类方法创建:

class test:
    ins=None
    @classmethod
    def instance(cls, *args, **kwargs):
        if cls.ins is None:
            cls.ins=object.__new__(cls)
        return cls.ins
t=test.instance() #创建

成员保护与访问限制

私有变量:以双下划线开头,外部无法访问,只能用 self.__私有变量 在类内部访问,核心目的是为提高封装的安全性;但用实例._类名__私有变量 可在外部强行访问,这是python语言的自由性,而你需要为自己强行访问造成的可能错误负责