第十五篇 面向对象进阶一
一、利用反射查看面向对象成员归属
反射:以字符串的形式去对象(模块)中操作成员
记住点:
1)反射如果查看对象:可以找对象,也可以找类的成员
2)反射查看类:只能找类的成员
如下代码
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo: def __init__(self,name): self.name = name def show(self): print("show") obj = Foo("a") F = hasattr(obj,"name") print(F) F = hasattr(obj,"show") print(F) r = hasattr(Foo,"name") print(r) F = hasattr(obj,"name") print(F)
执行True True False True
二、利用反射导入模块、查找类、创建对象、查找相应的字段
问题:如何去一个模块中调用或者查看成员?
下面就是例子
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo: def __init__(self,name): print("xxx") self.name = name def show(self): print("show")
#!/usr/bin/env python # -*- coding:utf-8 -*- #导入模块 m = __import__("BB",fromlist=True) #利用反射去模块中找类 class_name = getattr(m,"Foo") #根据类创建对象 obj = class_name("hello") #根据反射去对象中找到相应的值 val = getattr(obj,"name") print(val)
上述流程:首先找到m模块,之后找到Foo这个类,创建一个class_name这个对象,然后利用反射找到对应的值
三、静态字段、普通字段、静态方法、类方法、特性
静态字段的意义:将对象中保存的重复的数据存放在类中
静态字段封装的是类的数据
普通字段封装的是对象的数据
所以类调用静态字段
对象调用普通字段
1 class Provice1: 2 #静态字段 3 country = "中国" 4 #这是对象里面的东西 5 def __init__(self,name): 6 #普通字段 7 self.name = name 8 def show(self): 9 print( "show") 10 #类方法:特点参数传递的是类名 11 @classmethod 12 def xxoo(cls): 13 print('xxoo',cls) 14 #静态方法 15 @staticmethod 16 def xo(arg1,arg2): 17 print("xo") 18 obj = Provice("a") 19 Provice1.xo(1,2) 20 Provice1.xxoo() 21 obj.xo(1,2)
@staticmethod 装饰函数就是静态方法
@classmethod 装饰函数 叫做类方法,类方法中参数必须有cls(cls参数传递的就是类名)
Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
1
)静态方法无需传入
self
参数,类成员方法需传入代表本类的
cls
参数;
2
)从第
1
条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3
)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
特性:
1、@property 将方法为造成一种字段
2、和1中的方法名一样的函数名.setter 获取上面的字段,然后修改内存中的数据
那怎么用呢?
下面代码:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 class Provice1: 4 #静态字段 5 country = "中国" 6 #这是对象里面的东西 7 def __init__(self,name): 8 #普通字段 9 self.name = name 10 @property #特性:将方法伪造成一种字段 11 #获取字段 12 def end(self): 13 tmp = "%s sb"%self.name 14 return tmp 15 #设置字段 16 @end.setter 17 def end(self,value): 18 print(value) 19 self.name = value 20 obj = Provice1("a") 21 #获取字段 22 print(obj.end) 23 #设置字段 24 obj.end = "123" 25 print(obj.end)
上面执行顺序:
首先执行end函数,设置end函数为123,也就是把123传入给value,然后执行17行的end函数输出123.sb