面向进阶补充
Posted 许二
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向进阶补充相关的知识,希望对你有一定的参考价值。
一 isinstance(obj,cls)和issubclass(sub,super)
isinstance(obj,cls)检查obj是否是类 cls 的对象
class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) #检查obj是否是类Foo的对象 --->True
isinstance(x,list)检查x是否是列表list
x=[] print(isinstance(x,list)) --->True
issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo(object): pass class Bar(Foo): pass print(issubclass(Bar, Foo)) #检查Bar类是否是Foo的派生类 --->True
二 反射
1 反射的概念
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领
域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
2.1 hasattr() 判断属性
hasattr(object,name)判断object中有没有一个name字符串对应的方法或属性
class People: country=‘China‘ def __init__(self,name): self.name=name p=People(‘egon‘) print(p.__dict__) --->{‘name‘: ‘egon‘} print(hasattr(p,‘name‘)) #等同于print(‘name‘ in p.__dict__),检查对象p是否有“name”属性 --->True print(hasattr(p,‘name1213‘)) #等同于print(‘name1213‘ in p.__dict__),检查对象p是否有“name1213”属性 --->False print(hasattr(p,‘country‘)) #p.country,相当于查找p下是否有country --->True print(People.__dict__) --->{‘__module__‘: ‘__main__‘, ‘country‘: ‘China‘, ‘__init__‘: <function People.__init__ at 0x0000000002203A60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘People‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘People‘ objects>, ‘__doc__‘: None} print(hasattr(People,‘country‘)) #People.country,相当于查找People下是否有country --->True print(hasattr(People,‘__init__‘)) #People.__init__,相当于查找People下是否有__init__ --->True
2.2 getattr() 获取属性
getattr(object, name, default=None) 获得对象object的‘name’属性,结果返回object.name的值
以上是关于面向进阶补充的主要内容,如果未能解决你的问题,请参考以下文章