Python中實現結構體類

十八哥87發表於2015-01-28

Ruby中有一個很方便的Struct類,用來實現結構體。這樣就不用費力的去定義一個完整的類來僅僅用作訪問屬性。

class Dog < Struct.new(:name, :age)
end

fred = Dog.new("fred", 5)
printf "name:%s age:%d", fred.name, fred.age
##name:fred age:5

Python3.4中也可以這麼幹,但寫法很累贅。其中包含self.name = name 這種很煩人的寫法。

class Dog(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

fred = Dog("fred", 5)
print('name:{name} age:{age}'.format(name=fred.name, age=fred.age))
##name:fred age:5

想到我大Python是無所不能的,有沒有一種簡化結構體類屬性定義的方法呢?答案肯定是有的。在補習了一些Python黑魔法技術後,我想到利用裝飾器函式和超程式設計技術來實現。

def struct(*name):
    """ 裝飾器函式
        用途:用於在類定義中,自動設定self.value = value
    """
    def decorator(func):
        def wrapper(*args, **kw):
            for i in range(len(name)):
                setattr(args[0], name[i], args[i+1])
            return func(*args, **kw)
        return wrapper
    return decorator

class Dog(object):
    @struct('name','age')   #黑魔法所在!
    def __init__(self, *all_value):
        pass

fred = Dog("fred", 5)
print('name:{name} age:{age}'.format(name=fred.name, age=fred.age))
##name:fred age:5

要注意的是,這種寫法會造成程式碼結構的不清晰。

相關文章