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"的属性

  

  

 

以上是关于Python基础之面向对象进阶的主要内容,如果未能解决你的问题,请参考以下文章

廖雪峰老师——Python进阶( 面向对象编程基础 )

python基础详解

Python基础-week06 面向对象编程进阶

Python之路第七篇--Python基础之面向对象及相关

13Python之面向对象进阶篇

Python之路:面向对象(进阶)