一. classmethod类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别就是,类方法只能访问类变量,不能访问实例变量。
# 但是可以访问类变量
# 在定义方法的时候,传入的参数为cls,意思就是class,也就是类本身,以往在不使用装饰器的时候,自动传入的参数是self,也就是实例对象。变为cls了,自然只能使用类本身的属性,而不能使用实例的。
二. staticmethod静态方法
既不能访问类变量,也不能访问实例变量,相当于孤立状态。
# @staticmethod下,无法使用类和其它方法的属性,需要在外部手动传入实例进行调用
# 使用很少,特殊场景应用多
三. property属性方法
把一个方法变成一个静态的属性(变量)
# property下,无其它传入参数,也无法更改其已经定义好的属性
如果想要更改静态属性,需要新建一个关联的更改方法:
# 装饰器为@原属性方法名字.setter,之后在传入的参数中加入需要更改的属性形参
如果想实现删除属性,同样的:
四. 反射
1.概念
计算机中“反射”是翻译自英文’reflection‘,reflection有两个意思:1.物理反射。2.反省,自省。计算机中的反射更接近于第二种,意思为程序有自我反省的能力,即程序在运行的时候有对某一个object的状态的判断能力。
比如我们创建一个函数,该函数有一个形参,我们在函数中打印出从参数传入进来的对象的两个属性。按照正常流程走,对象通过参数传入函数,函数打印出对象的两个属性,但是如果传进来的对象没有这两个属性呢?这时候就应用到了“反射”,即程序自我反省的能力。
# 如上这个例子,我们用父类创建了一个实例a,再将a传入子类car_attack中的方法car_val中。如果我们想要事先验证其是否具有该属性再进行调用,调用时候进行如下修改:
# 使用if语句,用hasattr函数查找对象a中是否有out属性,如果没有才执行该程序,这样就完成了检测对象属性。
2.通过字符串对对象中的属性进行操作
3.反射模块成员
除了可以用来检测类中有没有某个方法,还可以用来检测模块下有没有方法,类,或者变量
# 图中所示所示引入了模块sys,通过sys.modules[__name__]自动获取当前模块的名字,再利用检测和获取函数来验证当前模块是否有要应用的函数或者类。
# 如上图我们预先写好了类,在下方代码中使用该类的内容的时候,便可以利用hasattr等函数对其进行调用,简化代码,增加逼格。