不一样的对象

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__:析构方法
#垃圾回收时触发

  

原文地址:https://www.cnblogs.com/shizhengwen/p/6222181.html