一、类的基本概念
类是一组具有相同属性和方法的所有对象的集合或者抽象,定义一个类使用关键字 class , 类里面的方法必须接收一个self参数,该参数表示创建的对象本身,其语法如下:
class test: name = '' age = 12 height = 165 def like(self): print('这是一个方法')
对象是类的一个实体,类是对象的抽象;对象是客观世界存在的一个实体。 用类创建一个对象并调用内部的属性,如下:
class Cat: name = '' def like(self): print('这是一个类的方法') def show(self): print(self.name) cat = Cat() cat.name = '属性赋值' cat.like() #这是一个类的方法 cat.show() # 属性赋值
每个类都默认存在一个__init__(self) 函数,称之为构造函数(初始化方法),用来创建对象,在创建对象的时候会自动调用。我们可以在创建对象的时候使用构造函数进行赋值:
class Stu: def __init__(self, _name, _age): print('这是一个构造函数') self.name = _name self.age = _age name = '' age = '' def show(self): print(self.name, self.age) obj = Stu('小米', 18) # 传参给构造函数进行赋值 obj.show() # 小米 18
每个类都默认存在一个 __del__(self) 函数,称为析构函数(销毁时的方法),在对象被动(del 删除)或主动(程序执行完毕)销毁的时候,会自动调用。我们可以使用析构函数在对象即将销毁时执行某些逻辑。
class Stu: def __del__(self): print('这是一个析构函数') obj = Stu() del obj
类封装的目的:类内部的数据可以在外部直接访问,这种方式不安全。我们需要限制在类的外部不能随意访问属性,并对某些属性进行隐藏。类的变量分为私有变量和类变量:
类的私有变量:在变量名前添加两个下划线开头,声明该属性为私有,不能在类的外部被使用或 访问。例如 __test = ‘这是私有属性’。如果必须在外部进行访问,可以使用 对象名._类名私有属性名 的方式进行访问 。对象名和类名之间有一个点和一个下划线,类名后面是私有属性名
类的私有方法:类的私有方法跟私有变量一样,在方法名前加两个下划线开头 ; 在外部访问的方式也跟私有变量一样
class Stu: __test = '这是私有变量' def get(self): return self.__test obj = Stu() print(obj._Stu__test) print(obj.get())
类变量:指的是所有对象所共享的变量,类变量定义在类的定义之后,实例化前后都可以使用
类变量可以用 类名.类变量 和 self.类变量 两种方式访问,后者一般不建议使用。类变量是所有对象所共享的,无论任何时候都建议用类名的方式访问类变量。
class Stu: name = '这是类变量' def test(self): print(self.name) # 两种方式都可以访问 print(Stu.name) # 推荐方式 print(Stu.name) # 外部使用类名也可以访问 obj = Stu() obj.test()
实例变量:指的是在__init__(self) 方法内声明的变量。 实例变量必须在实例化类后才能使用。实例变量只能通过对象访问(self), 不能通过类名访问。
class Stu: def __init__(self, name, age): self.name = name # 实例变量 self.age = age
类的三种方法分为 静态方法、类方法、实例方法。
实例方法:只能被实例对象调用,第一个参数必须默认传实例对象,一般习惯用self。 在实例方法内部调用另一个实例方法,使用 self.方法名
静态方法:使用 @staticmethod 修饰,对于参数没有要求,可以用 类名.方法名 和 self.方法名 两种方式访问。在静态方法内部调用另一个静态方法,使用 类名.方法名
类方法: 使用@classmethod 修饰, 第一个参数必须默认传类, 一般习惯用 cls 。可以用 类名.方法名 和 self.方法名 两种方式访问
class Stu: def __init__(self): print('这是一个实例方法') @staticmethod def statics(): print('这是一个静态方法') @classmethod def classTest(cls): print('这是一个类方法')
继承的概念:一个类从另一个类中继承一些属性和方法,(无法继承私有的)我们把这个类叫做子类(派生类),另一个类叫做父类(基类)。其语法如下:class childrenClass(parentClass)
多继承: 一个子类可以同时继承多个父类,用 逗号隔开;如果继承的父类有相同的属性或者方法,则按照传入的顺序优先使用,先传先用。
继承传递: 如果A类继承B类, B类继承C类, 那么默认A类继承C类。
类方法重写: 当子类继承的方法不适用的时候,可以进行重写。在子类内部定义一个跟继承方法相同名称的的方法,可以覆盖继承过来的方法。
class parent: name = '这是父类属性' def show(self): print(parent.name) class children(parent): types = '这是子类属性' def test(self): print(children.types) obj = children() obj.test() obj.show()