Python之面向对象进阶------反射(Day26)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之面向对象进阶------反射(Day26)相关的知识,希望对你有一定的参考价值。
一
classmethod
class Classmethod_Demo(): role = ‘dog‘ @classmethod def func(cls): print(cls.role) Classmethod_Demo.func()
staticmethod
class Staticmethod_Demo(): role = ‘dog‘ @staticmethod def func(): print("当普通方法用") Staticmethod_Demo.func()
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(obj,cls)检查object是否是类class的对象
class Foo(object): pass obj = Foo() sinstance(obj, Foo)
issubclass(sub,super)检查sub的类是否是super类的派生类
class Foo(object): pass class Bar(Foo): pass issubclass(Bar, Foo)
三.反射
在Python中一切事物皆对象 ,都可以使用反射。面向对象的反射:通过字符串的形式操作对象相关的属性
两个很重要的方法: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__) 四个方法的使用演示
以上是关于Python之面向对象进阶------反射(Day26)的主要内容,如果未能解决你的问题,请参考以下文章