python OOP基础

类的定义

       通过class语句定义一个类,class语句是一个可执行语句,类似于def。可执行语句,即只有当python解释器执行到该语句,类对象才会被定义,不然是不存在的。要注意的是,执行class语句或者def语句,只是在解释器中创建一个具有相应名称类对象或者函数对象而已,类里面或者函数里面的语句并不会执行,只有当创建实例或者调用相应函数时,里面的语句才会被执行。因此,即使类里面或者函数里面的语句语法有问题,在执行class或者def语句时并不会报错。

类属型和实例属性       

       类具有类属性,类属性就是定义在类顶层的对象,比如顶层变量或者顶层函数等,都是类属性,类属型被所有实例对象共享。相应的,还有实例属性,实例属性就是通过self.var=value赋值的属性。类属性可以通过类直接访问,但是实例属性需要创建实例对象后,且执行了相应的赋值语句才能创建和访问。对于类X,可以通过X.__dict__来获取类属型,对于实例x,可以通过x.__dict__来获取实例属性,dir(x)可以获取实例所有可访问的属性。

方法函数

       在类中定义函数,默认类中的函数第一个位置的参数是实例对象本身,也就是说,默认类中定义的方法都是实例方法。实例方法的第一个位置参数为实例对象本身,但是参数的名称实际上并不重要,但是通常情况下,我们通过self来表示。除了实例方法,我们还可以通过@classmethod装饰器来定义类方法,类方法的第一个位置参数表示类本身,而不是实例本身,对于类方法,第一个位置参数名通常写作cls;还可以通过@staticmethod装饰器定义静态方法,静态方法没有要求第一个位置参数具有特殊意义,静态方法和普通函数完全一样。故,实际上类定义的函数默认都是实例方法,要定义类方法或者静态方法,需要额外的装饰器来声明。

方法的调用

       假设类X有类方法f1,实例方法f2,创建一个实例对象x,那么X可以直接调用类方法f1,实例对象可以调用实例方法f1和类方法f2。当实例对象x调用f2时,即x.f2()语句实际上执行的是X.f2(x),即实际上是X调用类属性f2,并把实例对象x作为参数传给f2,所以如果直接用X调用f2,那么会缺少实例对象参数,从而会报错,故类不可以直接调用实例方法。但是类可以直接调用类方法,X.f1()实际上就是X.f1(X)。

作用域

       类变量的作用域遵循LEGB原则,其中类本身作为L层级。所以,当定义一个类后,类中的变量就是局部变量,类外无法直接通过作用域访问类中变量。其实只要记住,class的作用域原则和def的作用域原则一样即可。

继承

       假设父类为A,子类为B,那么继承的语法为class B(A),同时为了保持父类的构造方法,需要在子类构造方法中调用父类的构造方法A.__init__(self,args)。

类变量区分

       主要注意区分全局变量、类变量、实例变量、类函数的局部变量。全局变量为模块变量,在模块顶层定义的变量;类变量实在类顶层定义变量,同时相对于类外,又是类的局部变量;实例变量是实例对象通过self.var=value赋值的变量;类函数局部变量是类中定义的函数的局部变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值