-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdemometaclss.py
More file actions
62 lines (44 loc) · 2.09 KB
/
demometaclss.py
File metadata and controls
62 lines (44 loc) · 2.09 KB
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
57
58
59
60
61
62
def upper_attr(future_class_name,future_class_parents,future_class_attr):
'''返回一个类,将属性都大写 version1.0'''
attrs = ((name,value) for name,value in future_class_attr.items() if not name.startswith('__'))
uppercase_attrs = dict((name.upper(),value) for name,value in attrs)
return type(future_class_name,future_class_parents,uppercase_attrs)#返回改写的类
class UpperAttrMetaClass(type):
# def __new__(cls,name,bases,dct):
# '''返回一个类,将属性都大写 version2.0'''
# attrs = ((name,value) for name,value in dct.items() if not name.startswith('__'))
# uppercase_attrs = dict((name.upper(),value) for name, value in attrs)
# return type.__new__(cls,name,bases,uppercase_attrs)
def __new__(mcs, name, bases, dct):
attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
uppercase_attrs = dict((name.upper(), value) for name, value in attrs)
return super(UpperAttrMetaClass, mcs).__new__(mcs, name, bases, uppercase_attrs)
class MetaClassModel(type):
def __new__(mcs, name, base, dct):
if name == 'Model':
return super(MetaClassModel, mcs).__new__(mcs, name, base, dct)
attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))
mapping = dict((name, value) for name, value in attrs)
for k in mapping:
dct.pop(k)
dct['__mapping__'] = mapping
return super(MetaClassModel, mcs).__new__(mcs, name, base, dct)
class Model(metaclass=MetaClassModel):
def save(self):
for k, v in self.__mapping__.items():
print(k, v)
class User(Model):
id = 1
name = 'll'
sex = 'll'
class Singleton(type):
def __init__(cls, name, base, dct):
super(Singleton, cls).__init__(name, base, dct)
cls._instance = None
def __call__(self, *args, **kwargs):
if self._instance == None:
self._instance = super(Singleton, self).__call__(*args, **kwargs)
return self._instance
if __name__ == '__main__':
u = User()
u.save()