zoukankan      html  css  js  c++  java
  • 不一样的对象

    isinstance(obj,cls)    判断实例在不在类里

    1 class Foo:
    2     pass
    3 f1=Foo()
    4 print(isinstance(f1,Foo))
    5 >>>True

    issubclss(sub,super)     判断 第一个类 是不是 第二个类的 继承 派生

    1 class Foo:
    2     pass
    3 class bar(Foo):
    4     pass
    5 print(issubclass(bar,Foo))
    6 >>>True

    反射

               hasattr(object,name)

               getaddr(object,name,default=None)

               setaddr(x,y,v)

               delattr(xy)

    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

    hasattr(object,name): 判断object中有没有一个name字符串对应的方法或属性

    1 class Foo:
    2     x=10
    3     def __init__(self,name):
    4         self.name=name
    5     def school(self):
    6         print("oldboy")
    7 f1=Foo("szw")
    8 print(hasattr(f1,"name"))
    9 >>>True

    getaddr(object,name,default=None):  存在就获取对应的值  ,不存在就报错,(默认值表示不在就返回)。

        可以都类和函数使用

     1 class Foo:
     2     x=10
     3     def __init__(self,name):
     4         self.name=name
     5     def school(self):
     6         print("oldboy")
     7 f1=Foo("szw")
     8 print(getattr(f1,"name"))
     9 print(getattr(f1,"age",123))
    10 >>>szw
    11 >>>123

    setaddr(x,y,v)    设置属性

     1 class Foo:
     2     x=10
     3     def __init__(self,name):
     4         self.name=name
     5     def school(self):
     6         print("oldboy")
     7 f1=Foo("szw")
     8 setattr(f1,"name","alex")
     9 print(f1.__dict__)
    10 >>>{'name': 'alex'}

    delattr(xy)  删除属性

     1 class Foo:
     2     x=10
     3     def __init__(self,name):
     4         self.name=name
     5     def school(self):
     6         print("oldboy")
     7 f1=Foo("szw")
     8 delattr(f1,"name")
     9 print(f1.__dict__)
    10 >>>{}

    对自己进行操作

     1 import sys
     2 def s1():
     3     print ('s1')
     4 def s2():
     5     print ('s2')
     6 this_module = sys.modules[__name__]
     7 print(hasattr(this_module, 's1'))
     8 print(getattr(this_module, 's2'))
     9 >>>True
    10 >>><function s2 at 0x0108D300>

     反射的机制

    1 class FtpClient:
    2     def __init__(self,addr):
    3         print("正在连接服务器%s"%addr)
    4         self.addr=addr
    1 from duixiang import FtpClient
    2 f1=FtpClient("192.168.1.1")
    3 if hasattr(f1,"get"):
    4     func_get=getattr(f1,"get")
    5     func_get()
    6 else:
    7     print("处理其他逻辑")
    8 >>>正在连接服务器192.168.1.1
    9 >>>处理其他逻辑

                 __setattr__

                 __delattr__

                 __getaddr__

     1 class Foo:
     2     x=1
     3     def __init__(self,y):
     4         self.y=y
     5     def __getattr__(self, item):
     6         print("执行__getattr__")    #找不到找这里
     7     def __delattr__(self, item):
     8         print("执行__delattr__")
     9         self.__dict__.pop(item)  #在这里删除
    10     def __setattr__(self, key, value):
    11         print("执行__setattr__")
    12         self.__dict__[key]=value  #在这里赋值
    13 f1=Foo(10)
    14 f1.y
    15 print(f1.__dict__)
    16 del f1.y
    17 print(f1.__dict__)
    18 >>>执行__setattr__
    19 >>>{'y': 10}
    20 >>>执行__delattr__
    21 >>>{}

     包装

    二次加工=继承+派生     继承的方式完成授权

     1 class List(list):
     2     def append(self,p_object):
     3         if type(p_object) is str:
     4             super().append(p_object)
     5 
     6 obj=List("shizhengwen")
     7 obj.append("123")
     8 obj.append(456)
     9 print(obj)
    10 >['s', 'h', 'i', 'z', 'h', 'e', 'n', 'g', 'w', 'e', 'n', '123']

    授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

    组合的方式完成授权

     1 import time
     2 class Open:
     3     def __init__(self,filename,mode="r+",encording="utf-8"):
     4         self.file=open(filename,mode,encoding="utf-8")
     5         self.mode=mode
     6         self.encording=encording
     7     def write(self,tiem):
     8         t=time.strftime("%Y-%m-%d-%X")
     9         self.file.write("%s %s"%(t,tiem))
    10     def __getattr__(self, item):
    11         print(item)
    12         return getattr(self.file,item)
    13 r1=Open("a.txt","r+")
    14 r1.write("741
    ")
    15 r1.write("wen
    ")

    六 描述符(__get__,__set__,__delete__)

      描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
    __get__():调用一个属性时,触发
    __set__():为一个属性赋值时,触发
    __delete__():采用del删除属性时,触发

     注意事项:

    一 描述符本身应该定义成新式类,被代理的类也应该是新式类
    二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中
    三 要严格遵循该优先级,优先级由高到底分别是
    1.类属性
    2.数据描述符
    3.实例属性
    4.非数据描述符
    5.找不到的属性触发__getattr__()

     -------------------------------------------------------------------------------------------------------------------------

    #自省
    hasattr(obj,"属性")#obj.属性 是否存在
    getattr(obj,"属性")#获取obj.属性  不存在则报错
    getattr(obj,"属性","默认值")#获取obj.属性  不存在不会报错,返回那个默认值
    setattr(obj,"属性","属性的值")#obj.属性=属性的值
    delattr(obj,"属性")#del obj.属性
    
    #__getattr__,__setattr__,__delattr__
    #obj点的方式去操作属性时触发的方法
    __getattr__:obj.属性 不存在时触发
    __setattr__:obj.属性=属性的值 时触发
    __delattr__:del obj.属性 时触发
    
    #__getitem__,__setitem__,__delitem__
    #obj[]的方式去操作属性时触发的方法
    __getitem__:obj["属性"] 时触发
    __setitem__:obj["属性"]=属性的值 时触发
    __delitem__:del obj["属性"] 时触发
    
    #_get__,__set__,delete__
    #描述就是一个新式类,这个类至少要实现上述三个方法的一个
    class 描述符:
        def __get__(self):
            pass
        def __set__(self, instance, value):
            pass
        def __delete__(self, instance):
            pass
    class 类:
        name=描述符()
    obj=类()
    obj.name #get
    obj.name="szw" #set
    del obj.name #delete
    
    #__del__:析构方法
    #垃圾回收时触发
    

      

  • 相关阅读:
    Python接口自动化之request请求封装
    AI缘起——达特茅斯会议
    AirtestProject测试框架
    强化学习落地:竞态场景下基于锁机制的闲置端口查用
    多智能体强化学习入门Qmix
    代码回滚----git reset 和 git revert 使用
    requestAnimationFrame
    深度剖析-事件循环event
    Ubuntu18.04安装ES也就是ELK
    Ubuntu18.04+kafka
  • 原文地址:https://www.cnblogs.com/shizhengwen/p/6222181.html
Copyright © 2011-2022 走看看