zoukankan      html  css  js  c++  java
  • Day20:Decorator and Metaclass

    1:enter and exit:

     1 class Foo:
     2     def __init__(self,name):
     3         self.name = name
     4 
     5     def __enter__(self):
     6         print('execute enter')
     7         return self    #self to f below
     8 
     9     def __exit__(self, exc_type, exc_val, exc_tb):   #the exit sentance over means the whole with sentence over!
    10         print('execute exit')
    11         print(exc_type)
    12         print(exc_val)
    13         print(exc_tb)
    14         return True    #swallow the wrong reports
    15 
    16 with Foo('a.txt') as f:      #f = obj.__enter()__
    17     print(f)             ##<__main__.Foo object at 0x0000000001DC7A60>
    18     print(sfsddsgfdgfdgdsfgsdf)
    19     print(f.name)        #a.txt
    20     # print('========>')
    21     # print('========>')
    22     # print('========>')
    23     # print('========>')
    24     # print('========>')
    25 
    26 print('000000000000000000000000')
    27 
    28 # the result:
    29 # execute enter
    30 # ========>
    31 # ========>
    32 # ========>
    33 # ========>
    34 # ========>
    35 # execute exit
    36 # 000000000000000000000000
    View Code

    2:The use of decorator:

      1 #==============>>>>>>>>>data descriptor:
      2 class Typed:
      3     def __init__(self,key,expected_type):
      4         self.key = key
      5         self.expected_type = expected_type
      6 
      7     def __get__(self, instance, owner):
      8         # print('get function')
      9         # print('instance parameter[%s]' %instance)
     10         # print('owner parameter [%s]' %owner)
     11         return instance.__dict__[self.key]
     12 
     13     def __set__(self, instance, value):
     14         # print('set function')
     15         # print('instance parameter[%s]' %instance)
     16         # print('owner parameter [%s]' %value)
     17         # print('=====>>',self)    =====>> <__main__.Typed object at 0x0000000002447A60>
     18         if not isinstance(value,self.expected_type):
     19             # print('please insert a string type')
     20             raise TypeError('%s is not the Type %s' %(self.key,self.expected_type))
     21         instance.__dict__[self.key] = value
     22 
     23     def __delete__(self, instance):
     24         return instance.__dict__.pop(self.key)
     25 
     26 class People:
     27     name = Typed('name',str)  #trigure __set__()
     28     age = Typed('age',int)
     29     salary = Typed('salary',float)
     30     gender = Typed('gender',str)
     31     def __init__(self,name,age,salary,gender):
     32         self.name = name
     33         self.age = age
     34         self.salary = salary
     35         self.gender = gender
     36 
     37 
     38 # p1 = People('zxver',18,33.3)
     39 # print(p1.__dict__)
     40 p1 = People('zxver',453,234)
     41 # print(p1.__dict__)
     42 # p1.name
     43 # print(p1.name)
     44 # p1.name = 'egon'
     45 # print(p1.__dict__)
     46 # del p1.name
     47 # print(p1.__dict__)
     48 #{'age': 18, 'salary': 33.3}
     49 #because the age is agented by the data descriptor which is higher level than object
     50 
     51 
     52 #the refined one:
     53 class Typed:
     54     def __init__(self,key,expected_type):
     55         self.key = key
     56         self.expected_type = expected_type
     57 
     58     def __get__(self, instance, owner):
     59         # print('get function')
     60         # print('instance parameter[%s]' %instance)   #p1
     61         # print('owner parameter [%s]' %owner)        #People
     62         return instance.__dict__[self.key]
     63 
     64     def __set__(self, instance, value):
     65         # print('set function')
     66         # print('instance parameter[%s]' %instance)
     67         # print('owner parameter [%s]' %value)
     68         # print('=====>>',self)    =====>> <__main__.Typed object at 0x0000000002447A60>
     69         if not isinstance(value,self.expected_type):
     70             # print('please insert a string type')
     71             raise TypeError('%s is not the Type %s' %(self.key,self.expected_type))
     72         instance.__dict__[self.key] = value
     73 
     74     def __delete__(self, instance):
     75         return instance.__dict__.pop(self.key)
     76 
     77 def deco(**kwargs):
     78     def wrapper(obj):
     79         for key,val in kwargs.items():
     80             # obj.__dict__[key]=val
     81              setattr(obj,key,Typed(key,val))
     82         return obj
     83     return wrapper
     84 
     85 # @deco(name=Typed('name',str),age = Typed('age',int),salary = Typed('salary',float),gender = Typed('gender',str))
     86 @deco(name=str,age=int,salary=float,gender=str)#can add the content which you need
     87 class People:
     88     # name = Typed('name',str)  #trigure __set__()
     89     # age = Typed('age',int)
     90     # salary = Typed('salary',float)
     91     # gender = Typed('gender',str)
     92     def __init__(self,name,age,salary,gender):
     93         self.name = name
     94         self.age = age
     95         self.salary = salary
     96         self.gender = gender
     97 
     98 
     99 # p1 = People('zxver',18,33.3)
    100 # print(p1.__dict__)
    101 p1 = People('zxver',18,13.7,'male')
    102 print(p1.__dict__)
    103 print(People.__dict__)
    View Code

    3:Class_decorator:

     1 # def deco(func):
     2 #     print('=======')
     3 #     return func
     4 #
     5 # # @deco        #test = deco(test)
     6 # # def test():
     7 # #     print('test is executing')
     8 #
     9 # # test()
    10 #
    11 # @deco     #Foo = deco(Foo)
    12 # class Foo:
    13 #     pass
    14 #
    15 # f1 = Foo()
    16 # print(f1)
    17 
    18 def deco(obj):
    19     print('=======',obj)
    20     obj.x = 1
    21     obj.y = 2
    22     obj.z = 3
    23     return obj
    24 
    25 @deco     #Foo = deco(Foo)
    26 class Foo:
    27     pass
    28 
    29 print(Foo.__dict__)
    30 
    31 #>>>>>>>>>>>>>>.all is object:
    32 @deco
    33 def test():
    34     print('test function')
    35 print(test.__dict__)
    36 
    37 
    38 ################
    39 
    40 def Typed(**kwargs):
    41     def deco(obj):
    42         print('=====>',kwargs)
    43         print('=====>',obj)
    44         for key,val in kwargs.items():
    45             # obj.__dict__[key]=val
    46              setattr(obj,key,val)
    47         # obj.x = 1
    48         # obj.y = 1
    49         # obj.z = 1
    50         return obj
    51     print('===>',kwargs)
    52     return deco
    53 
    54 @Typed(x=1,y=2,z=3)   #it will execute with ()  1.Typed(x=1,y=2,z=3) --->deco 2.@deco --->Foo=deco(Foo)
    55 class Foo:
    56     pass
    57 print(Foo.__dict__)
    58 
    59 @Typed(name='zxver')    #Bar = deco(Bar)
    60 class Bar:
    61     pass
    62 print(Bar.__dict__)
    63 print(Bar.name)
    View Code

    4:Property:

     1 class Lazyproperty:
     2     def __init__(self,func):
     3         print('=======>>')
     4         self.func = func
     5 
     6     def __get__(self, instance, owner):
     7         if instance is None:
     8             return self
     9         res = self.func(instance)
    10         setattr(instance,self.func.__name__,res)
    11         return res
    12 
    13     # def __set__(self, instance, value):
    14     #     pass
    15     
    16 ##*****************:important:if add __set__attribute ,the set priviledge will be higher ,then when you call tha r1.area,
    17 ##it can't ectract the content from r1.
    18 
    19 class Room:
    20     def __init__(self,name,width,length):
    21         self.name = name
    22         self.width = width
    23         self.length = length
    24 
    25     # @property  #area = property(area)
    26     @Lazyproperty    #area = Lazyproperty(area)    #execute Lazyproperty's _init__function
    27     def area(self):
    28         return self.width * self.length
    29 
    30     @property
    31     def area1(self):
    32         return self.width * self.length
    33     @property
    34     def test(self):
    35         # print('------')
    36         return '11111111111111'
    37 
    38 r1 = Room('restroom',1,1)
    39 ########instance call:
    40 # print(r1.area1)    #execute __get__()
    41 # print(r1.area1)    #execute __get__()
    42 # print(r1.area1)    #execute __get__()
    43 
    44 print(r1.area)        #execute __get__()
    45 print(r1.__dict__)    ##extract from the r1
    46 print(r1.area)        ##extract from the r1
    47 
    48 ########class call:
    49 # print(Room.area)   #add a condition to judge the instance is None,return self,or it will report wrong.
    50 #result:<__main__.Lazyproperty object at 0x0000000001DD7A60>
    51 
    52 # r1 = Room('restroom',1,1)
    53 # print(r1.area.func(r1))
    54 # print(Room.__dict__)
    55 # print(r1.test)
    56 # print(Room.test)
    57 #redult:<property object at 0x0000000001E2A0E0>
    View Code

    5:Metaclass:

     1 # class Foo:
     2 #     pass
     3 #
     4 # f1 = Foo()
     5 #
     6 # print(type(f1))
     7 # print(type(Foo))
     8 #the result:
     9 # <class '__main__.Foo'>
    10 # <class 'type'>
    11 
    12 #the two method to make class:
    13 ###########1:
    14 # class Foo:
    15 #     pass
    16 # print(Foo)
    17 
    18 ##########2:
    19 def __init__(self,name,age):
    20     self.name = name
    21     self.age = age
    22 
    23 def test(self):
    24     print('=====>')
    25 
    26 FFo = type('FFo',(object,),{'x':1,'__init__':__init__,'test':test})   #type(name,father level,attribute)
    27 print(FFo)
    28 print(FFo.__dict__)
    29 f1 = FFo('alex',19)
    30 print(f1.x)
    31 print(f1.test)
    32 f1.test()
    33 
    34 #####make own metaclass:
    35 
    36 class MyType(type):
    37     def __init__(self,a,b,c):
    38         # print(a)
    39         # print(b)
    40         # print(c)
    41 
    42 #:Foo
    43 # ()
    44 # {'__module__': '__main__', '__qualname__': 'Foo', '__init__': <function Foo.__init__ at 0x0000000001E0D0D0>}
    45         print('made metaclass')
    46 
    47     def __call__(self, *args, **kwargs):
    48         print('=======>')
    49         print(self)
    50         print(args,kwargs)
    51         obj = object.__new__(self)   #create a new object;object.__new__(Foo) >>f1
    52 #the result:
    53 # <class '__main__.Foo'>
    54 # ('zxver',) {}
    55         self.__init__(obj,*args, **kwargs)   #Foo.__init__(f1,*args, **kwargs)
    56         return obj
    57 
    58 
    59 class Foo(metaclass=MyType): #Mytype(self,'Foo',(object,),{}),four attributes
    60     def __init__(self,name):
    61         self.name = name  #obj,f1.name = name
    62 
    63 # print(Foo)
    64 f1 = Foo('zxver')
    65 # print(f1.__dict__)
    66 print(f1)
    67 print(f1.__dict__)
    View Code

    6:Make classmethod:

     1 class ClassMethod:
     2     def __init__(self,func):
     3         self.func=func
     4 
     5     def __get__(self, instance, owner): #类来调用,instance为None,owner为类本身,实例来调用,instance为实例,owner为类本身,
     6         def feedback(*args,**kwargs):
     7             print('在这里可以加功能啊...')
     8             return self.func(owner,*args,**kwargs)
     9         return feedback
    10 
    11 class People:
    12     name='linhaifeng'
    13     @ClassMethod # say_hi=ClassMethod(say_hi)
    14     def say_hi(cls,msg):
    15         print('你好啊,帅哥 %s %s' %(cls.name,msg))
    16 
    17 People.say_hi('你是那偷心的贼')
    18 
    19 p1=People()
    20 p1.say_hi('你是那偷心的贼')
    View Code
  • 相关阅读:
    [Zjoi2014]力(FFT,卷积)
    LOJ 6240. 仙人掌
    Web 服务编程技巧和诀窍: 将 <xsd:any/> 元素用于自定义序列化(转)
    Ant工具使用说明(转)
    Web 服务编程技巧与窍门: 用 SAAJ 和 JAXRPC 构建 SOAP 响应信封(转)
    Axis2 quick start 中文版
    使用SOAP开发java web服务Axis开发方案(转)
    k 动画脚本很有算法 同时可以借鉴这里的画圆
    ui 界面美观化 (多维子材质脚本)
    系类函数介绍 之中可能没有一些预订变量 应用时要自己加上。
  • 原文地址:https://www.cnblogs.com/zxver/p/12912548.html
Copyright © 2011-2022 走看看