-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbasic_syntax.py
More file actions
99 lines (78 loc) · 3.28 KB
/
Copy pathbasic_syntax.py
File metadata and controls
99 lines (78 loc) · 3.28 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# -*- coding: utf-8 -*-
"""
Python Env: python3
Briet: test basic syntax of python3
Author: Barry
"""
import unittest
class TestTypeFunction(unittest.TestCase):
"""Usage: how to create a class by type()"""
def test_type_func(self):
class BaseClass(object):
def echo_a(self):
print("call TestTypeFunction.echo_a()")
return True
def echo_my_class(self):
print("call TestTypeFunction.echo_my_class()")
return True
my_class_type = type('MyClass', (BaseClass, ), {'echo_my_class': echo_my_class})
my_class = my_class_type()
self.assertNotEqual(my_class_type.mro(), None)
self.assertNotEqual(my_class, None)
self.assertEqual(my_class.echo_a(), True)
self.assertEqual(my_class.echo_my_class(), True)
class TestClassSyntax(unittest.TestCase):
"""Usage: derive a new class from base class which hasn't a __init__()"""
def test_class(self):
class Base:
pass
class A(Base):
def __init__(self, x):
super().__init__()
print('print A.__init__()', x)
class B(A):
def __init__(self):
print('print B.__init__')
super().__init__("input x")
obj = B()
self.assertNotEqual(id(obj), None)
class TestMetaClassSyntax(unittest.TestCase):
"""Usage: how to create a metaclass which support singleton trait"""
def test_meta_class(self):
class MyMetaClass(type):
def __new__(mcs, name, bases, attrs):
"""allocate memory operation / create an EarthIsSingleton class"""
print("enter MyMetaClass.__new__()")
if name == "Model":
return super().__new__(mcs, name, bases, attrs)
else:
set_attrs = ((name, value) for name, value in attrs.items() if not name.startswith('__'))
uppercase_attr = dict((name.upper(), value) for name, value in set_attrs)
return super().__new__(mcs, name, bases, uppercase_attr)
def __init__(cls, name, bases, attrs):
"""enter MyMetaClass.__init__()"""
print("enter MyMetaClass.__init__()")
super().__init__(name, bases, attrs)
cls.__instance = None
def __call__(cls, *args, **kargs):
"""enter MyMetaClass.__call__()"""
print("enter MyMetaClass.__call__()")
if cls.__instance:
return cls.__instance
else:
cls._instance = super().__call__(*args, **kargs)
return cls.__instance
class EarthIsSingleton(metaclass=MyMetaClass):
People = "abc"
__instance = None
def __init__(self):
self.AAA = 1000
print("enter Earth.__init__() ...")
earth1 = EarthIsSingleton()
earth2 = EarthIsSingleton()
self.assertEqual(id(earth1), id(earth2))
#self.assertEqual(earth1.AAA, 1000)
def __main():
unittest.main()
if __name__ == '__main__':
__main()