32 lines
740 B
Python
32 lines
740 B
Python
|
|
#!/usr/bin/env python
|
||
|
|
# -*- encoding: utf-8 -*-
|
||
|
|
"""
|
||
|
|
Topic: 在定义的时候初始化类的成员
|
||
|
|
Desc :
|
||
|
|
"""
|
||
|
|
|
||
|
|
import operator
|
||
|
|
|
||
|
|
|
||
|
|
class StructTupleMeta(type):
|
||
|
|
def __init__(cls, *args, **kwargs):
|
||
|
|
super().__init__(*args, **kwargs)
|
||
|
|
for n, name in enumerate(cls._fields):
|
||
|
|
setattr(cls, name, property(operator.itemgetter(n)))
|
||
|
|
|
||
|
|
|
||
|
|
class StructTuple(tuple, metaclass=StructTupleMeta):
|
||
|
|
_fields = []
|
||
|
|
|
||
|
|
def __new__(cls, *args):
|
||
|
|
if len(args) != len(cls._fields):
|
||
|
|
raise ValueError('{} arguments required'.format(len(cls._fields)))
|
||
|
|
return super().__new__(cls, args)
|
||
|
|
|
||
|
|
|
||
|
|
class Stock(StructTuple):
|
||
|
|
_fields = ['name', 'shares', 'price']
|
||
|
|
|
||
|
|
|
||
|
|
class Point(StructTuple):
|
||
|
|
_fields = ['x', 'y']
|