classmethod 和staticmethod的区别
classmethod:我们把它叫做类方法
staticmethod:我们把它叫做静态方法
在python中,静态方法和类方法都是可以通过类对象和类对象实例访问,但是区别是:
[email protected]:是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的叫作实例方法,类方法的参数是cls,而实例方法的参数是self,它表示该类的一个实例
2.普通对象方法至少需要一个self参数,表示类对象实例
3.类方法有类变量cls传入从而可以用cls做一些相关的处理,并且有子类继承是,调用该类方法时,传入的类变量cls是子类而非父类 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
4.静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少
isinstance和issubclass:
我的理解是,isinstance是检查,对象是不是类的对象的
issubclass是检查,子类是不是父类的子类
同志们重点来了啊
反射:反射就是指程序可以访问,检测和修改它本身状态或行为的一种能力
python面向对象中的反射,通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
在这里有两个非常重要的方法:
hasattr
getatter
我的理解是是这样的,有什么不对的希望大家指出,就是说hasattr就是一个检查的作用,就是检查是否含有某属性,它会返回一个布尔值,而getattr是获取这个属性的,类方法输出的时候在后面直接加()就搞定了,它们可以运用到类,对象,模块中(在模块中分内模块和外模块的)
在这里还有一个setattr和delattr,做于了解
class Foo: f = ‘类的静态变量‘ def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print(‘hi,%s‘%self.name) obj=Foo(‘egon‘,73) #检测是否含有某属性 print(hasattr(obj,‘name‘)) print(hasattr(obj,‘say_hi‘)) #获取属性 n=getattr(obj,‘name‘) print(n) func=getattr(obj,‘say_hi‘) func() print(getattr(obj,‘aaaaaaaa‘,‘不存在啊‘)) #报错 #设置属性 setattr(obj,‘sb‘,True) setattr(obj,‘show_name‘,lambda self:self.name+‘sb‘) print(obj.__dict__) print(obj.show_name(obj)) #删除属性 delattr(obj,‘age‘) delattr(obj,‘show_name‘) delattr(obj,‘show_name111‘)#不存在,则报错 print(obj.__dict__)