面向进阶补充

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的值

 

 

 

 

 

 

 

  

以上是关于面向进阶补充的主要内容,如果未能解决你的问题,请参考以下文章

面向对象的进阶 ~懒得起名了

面向对象进阶篇

面向对象进阶篇

what' the python之面向对象(进阶)

VSCode 配置 用户自定义代码片段 自定义自动代码补充

面向对象进阶