python基礎-面向物件(二十三)面向物件進階(十一)裝飾器和描述符聯合使用
阿新 • • 發佈:2020-12-17
面向物件(二十一)說了,描述符實現了對引數的型別檢測,如果引數非常多呢?當然可以一個一個貼上,太麻煩了。可以和裝飾器一起使用。
class Discriptor: # 描述器 def __init__(self, key, expected_type): self.key = key self.expected_type = expected_type def __get__(self, instance, owner): return instance.__dict__[self.key] def __set__(self, instance, value): if type(value) != self.expected_type: print('你輸入的%s不是%s' % (value, self.type_expected)) raise TypeError instance.__dict__[self.key] = value def __delete__(self, instance): pass def decorator(**kwargs): # 裝飾器 def deco(obj):for key, value in kwargs.items(): # @decorator(key=value) setattr(obj, key, Discriptor(key, value)) # obj.key=Discriptor(key,value) 在設定。會呼叫Discriptor.__set__ return obj # 別漏了return return deco @decorator(name=str, age=int, gender=str) # Test=decorator(Test) class Test:# name=Discriptor('name',str) # age=Discriptor('age',int) # gender=Discriptor('gender',str) #用裝飾器來批量寫入 def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender test1 = Test('蒼老師', 20, '女') print(test1.__dict__) test2 = Test(1111, 2, '女')