1. 程式人生 > 實用技巧 >python基礎-面向物件(二十三)面向物件進階(十一)裝飾器和描述符聯合使用

python基礎-面向物件(二十三)面向物件進階(十一)裝飾器和描述符聯合使用

面向物件(二十一)說了,描述符實現了對引數的型別檢測,如果引數非常多呢?當然可以一個一個貼上,太麻煩了。可以和裝飾器一起使用。

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, '')