面像对象高级

isinstance:判断某个对像是否是某个类产生的
class Foo:
    pass

obj=Foo()
# print(isinstance(obj,Foo)) # 推荐使用该函数来判断一个函数的类型
# print(type(obj) is Foo)

# print(isinstance('abc',str))    #判断是否是字符串类
# print(isinstance(123,int))     #判断是否是数字类


print(issubclass(Foo,object))    #所有新生类的基类都是object

重点!!!!!

      反射: 通过字符串来操作类与对象的属性,这种操作称为反射。

class People:
    country="China"
    def __init__(self,name):
        self.name=name
    def tell(self):
        print('%s is aaa' %self.name)

obj=People('egon')

   1,hasattr     #判断某个属性在不在一个类里或者一个对象有没有某个对象

 print(hasattr(People,'country'))
 print('country' in People.__dict__)

 print(hasattr(obj,'name')) print(hasattr(obj,'country')) print(hasattr(obj,'tell'))

   2,getattr     #从类或者对象里拿到某个属性

 x=getattr(People,'country1',None)    #从类里拿到某个属性 print(x)

 f=getattr(obj,'tell',None)#obj.tell      #从对象里拿到某个属性 print(f == obj.tell) f() obj.tell()

   3,setattr    #在类里增加属性

People.x=111
 setattr(People,'x',111)     #增加x=111的数据属性 print(People.x)

 obj.age=18 setattr(obj,"age",18) print(obj.__dict__)

   4,delattr      #删除属性

 del People.country delattr(People,"country") print(People.__dict__)

 del obj.name delattr(obj,"name") print(obj.__dict__)

以上四种方法可以处理字符串类型的命令,所以我们可以利用这个特性做很多事

比如下面这种:

class Foo:
    def run(self):
        while True:
            cmd=input('cmd>>: ').strip()      #让用户输入命令
            # print('%s run...' %cmd)
            if hasattr(self,cmd):            #因为可以处理字符串类型的命令,所以可以直接调用
                func=getattr(self,cmd)
                func()

    def download(self):
        print('download....')

    def upload(self):
        print('upload...')

# obj=Foo()
# obj.run()
描述符 __get__()   __set__()    __delete__()

  __get__():调用一个属性时才触发
 __set__():为一个属性赋值时触发
 __delete__():采用del删除属性时触发

 

posted @ 2018-04-17 16:57  鲁之敬  阅读(68)  评论(0编辑  收藏  举报