元编程-5

利用元类捕获类的定义信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from collections import OrderedDict


class Typed:
_expected_type = type(None)
def __init__(self, name=None):
self._name = name

def __set__(self, instance, value):
if not isinstance(value, self._expected_type):
raise TypeError('Expected {}'.format(str(self._expected_type)))
instance.__dict__[self._name] = value


class Integer(Typed):
_expected_type = int


class Float(Typed):
_expected_type = Float


class String(Typed):
_expected_type = str


class OrderedMeta(type):
def _ _new__(cls, clsname, bases, clsdict):
d = dict(clsdict)
order = []
for name, value in clsdict.items():
if isinstance(value, Typed):
value._name = name
order.append(name)
d['_order'] = order
return type.__new__(cls, clsname, bases, d)

@classmethod
def __prepare__(cls, clsname, bases):
return OrderedDict()


class Structure(metaclass=OrderedMeta):
def as_csv(self):
return ','.join(str(getattr(self.name)) for name in self._order)


class Stock(Structure):
name = String()
shares = Integer()
price = Float()

def __init__(self, name, shares, price):
self.name = name
self.shares = shares
self.price = price