Python基础之面向对象进阶
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python基础之面向对象进阶相关的知识,希望对你有一定的参考价值。
一、isinstance(obj,cls)和issubclass(sub,super)
1、isinstance(obj,cls)检查obj是否是类 cls 的对象
class A: pass obj = A() #实例化对象obj isinstance(对象名,类名)#语法 print(isinstance(obj,A)) #isinstance函数返回的是布尔值,True,则obj,是A产生的对象 print(isinstance(object,A)) #同上,反之,为不是。 ---------------输出结果------------------- True False
2、issubclass(sub, super)检查sub类是否是 super 类的派生类或子类
class A: #定义父类 pass class B(A): #定义子类,继承A pass issubclass(子类名,父类名) #语法 print(issubclass(B,A)) #返回的也是布尔值,True为真,则B,是A的子类,反之,不是 -------------输出结果------------------ True
二、反射
1、什么是反射:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
2、反射的简单含义:
1、通过类名获得类的实例对象
2、通过方法名得到方法,实现调用
3、python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)。
反射即想到4个内置函数分别为:hasattr、getattr、setattr、delattr 获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子:
class motorcycle: #仅限二轮摩托 feature = "两个轱辘" #相对而言 def __init__(self,brand,price): self.brand = brand self.price = price def advance(self): #都有前进的技能 print("%s,出发了!"%self.brand) def stop(self): #都有减速,停车功能 print("%s,减速了!"%self.brand) m1 = motorcycle("春风",28800) #实例化对象m1
3.1、hasattr(obj,"name"):检测obj里是否含有"name"属性
#检测是否含有某属性 print(hasattr(m1,"feature")) #检测对象m1是否有类的数据属性 print(hasattr(m1,"brand")) #检测m1里是否有"brand"这个数据属性 print(hasattr(m1,"advance")) #检测m1里是否有"advance"这个绑定方法 print(hasattr(motorcycle,"feature")) #一切皆对象,加测类里面是否有"feature"这个数据属性 print(hasattr(motorcycle,"stop")) #一切皆对象,检测类里面是否有"stop"这个函数属性 print(hasattr(m1,"abcd")) #检测到没有这个"abcd"的时候,此时,会返回False ----------------------输出结果------------------- True True True True True False
3.2、getattr(obj,"name"):获取obj里的"name"的属性
#获取某属性 n = getattr(m1,"brand") #获取m1的品牌属性,并赋值给n print(n) #打印n n1 = getattr(motorcycle,"feature") #一切皆对象,获取类的数据属性,并赋值给n1 print(n1) #打印n1 n2 = getattr(m1,"feature") #获取对象m1的类的特征,并赋值给n2 print(n2) #打印n2 n3 = getattr(m1,"advance") #获取m1的绑定方法,并赋值给n3 n3() #现在n3就是m1的绑定方法,加括号就能调用 n4 = getattr(motorcycle,"stop") #获取类的函数属性,并赋值给n4 n4(m1) #因为n4是类的函数属性,so,调用的时候要传参 #getattr(m1,"abcd") #没有abcd"会报错 print(getattr(m1,"abcd","不存在啊!")) #没有"abcd"会打印后面的字符串 -----------------输出结果-------------------- 春风 两个轱辘 两个轱辘 春风,出发了! 春风,减速了! 不存在啊!
3.3、setattr(obj,"name",content):设置obj里的"name"的属性
#设置某属性 setattr(m1,"displacement",650) #新增m1的"displacement"数据属性 setattr(m1,"show_brand",lambda self: self.brand+"666") #新增m1的函数属性 setattr(m1,"price",26800) #春风做活动,回馈车友,减价2000,修改m1的价格 setattr(motorcycle,"show_brand",lambda self:self.brand+"666") #新增类的函数属性 setattr(motorcycle,"feature","两个轱辘,还有三个轱辘的") #修改类的特征 print(m1.show_brand(m1)) #注意,此时"show_brand"就是一个普通函数,需要传一个参数进去 print(motorcycle.show_brand(m1)) #类名.新增的函数名加括号调用,因为是函数属性,so,要传参 print(m1.__dict__) #打印对象m1的所有的属性 print(motorcycle.__dict__) #打印类motorcycle的所有的属性 -------------------输出结果-------------------------- 春风666 春风666 {‘brand‘: ‘春风‘, ‘price‘: 26800, ‘displacement‘: 650, ‘show_brand‘: <function <lambda> at 0x0000000002113E18>} {‘__module__‘: ‘__main__‘, ‘feature‘: ‘两个轱辘,还有三个轱辘的‘, ‘__init__‘: <function motorcycle.__init__ at 0x00000000025FA950>,\ ‘advance‘: <function motorcycle.advance at 0x00000000025FA9D8>, ‘stop‘: <function motorcycle.stop at 0x00000000025FAA60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘motorcycle‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘motorcycle‘ objects>, ‘__doc__‘: None, ‘show_brand‘: <function <lambda> at 0x00000000025FAAE8>}
3.4、delattr(obj,"name"):删除obj里的"name"的属性