|
30 | 30 | " # A proxy almost always wraps up the object it proxies to\n",
|
31 | 31 | " def __init__(self, part):\n",
|
32 | 32 | " self.part = part\n",
|
| 33 | + " # Question - Why the self.__class__ ?\n", |
33 | 34 | " self.__class__.parts_count += 1\n",
|
34 | 35 | " count = self.__class__.parts_count\n",
|
35 | 36 | " # Register the part!\n",
|
|
73 | 74 | "name": "stdout",
|
74 | 75 | "output_type": "stream",
|
75 | 76 | "text": [
|
| 77 | + "__prepare__: <class '__main__.PartsTypeProxyFactory'> Part\n", |
76 | 78 | "__init__: <class '__main__.Part'>\n"
|
77 | 79 | ]
|
78 | 80 | }
|
|
86 | 88 | " print('__init__:',cls)\n",
|
87 | 89 | " type.__init__(cls, *args)\n",
|
88 | 90 | " \n",
|
89 |
| - " def my_new(cls,name,bases=(),dct={}):\n", |
90 |
| - " print(cls,name)\n", |
| 91 | + " @classmethod\n", |
| 92 | + " def my_new(mcs,cls,bases=(),dct={}):\n", |
| 93 | + " print('__new__:',mcs,cls)\n", |
91 | 94 | " instance = object.__new__(cls)\n",
|
92 |
| - " # instance = object.__new__(cls)\n", |
| 95 | + "\n", |
93 | 96 | " return instance\n",
|
94 | 97 | " \n",
|
95 | 98 | " @classmethod\n",
|
96 | 99 | " def create(cls, *args, **kwargs):\n",
|
97 |
| - " print('create:',args)\n", |
| 100 | + " print('create:',cls,args)\n", |
98 | 101 | " return PartProxy(Part(*args, **kwargs))\n",
|
99 | 102 | " \n",
|
100 | 103 | " @classmethod\n",
|
101 |
| - " def __prepare__(cls, name, bases, **kwargs):\n", |
102 |
| - " return {'__new__': cls.my_new}\n", |
| 104 | + " def __prepare__(mcs, cls, bases, **kwargs):\n", |
| 105 | + " print('__prepare__:',mcs,cls)\n", |
| 106 | + " return {'__new__': mcs.my_new}\n", |
103 | 107 | "\n",
|
104 | 108 | "\n",
|
105 | 109 | "class Part(metaclass=PartsTypeProxyFactory):\n",
|
|
126 | 130 | "name": "stdout",
|
127 | 131 | "output_type": "stream",
|
128 | 132 | "text": [
|
129 |
| - "create: ('Nut',)\n", |
130 |
| - "<class '__main__.Part'> Nut\n", |
| 133 | + "create: <class '__main__.PartsTypeProxyFactory'> ('Nut',)\n", |
| 134 | + "__new__: <class '__main__.PartsTypeProxyFactory'> <class '__main__.Part'>\n", |
131 | 135 | "__init__: Nut None\n",
|
132 |
| - "{1: <__main__.Part object at 0x7fb5744a3f28>}\n", |
133 |
| - "create: ('Bolt', <__main__.PartProxy object at 0x7fb5744a3fd0>)\n", |
134 |
| - "<class '__main__.Part'> Bolt\n", |
| 136 | + "{1: <__main__.Part object at 0x7f9478a3cf60>}\n", |
| 137 | + "create: <class '__main__.PartsTypeProxyFactory'> ('Bolt', <__main__.PartProxy object at 0x7f9478a3cf28>)\n", |
| 138 | + "__new__: <class '__main__.PartsTypeProxyFactory'> <class '__main__.Part'>\n", |
135 | 139 | "__init__: Bolt Nut, parent: None \n",
|
136 |
| - "{1: <__main__.Part object at 0x7fb5744a3f28>, 2: <__main__.Part object at 0x7fb5744a3a58>}\n", |
137 |
| - "create: ('Screw', <__main__.PartProxy object at 0x7fb5744a3978>)\n", |
138 |
| - "<class '__main__.Part'> Screw\n", |
| 140 | + "{1: <__main__.Part object at 0x7f9478a3cf60>, 2: <__main__.Part object at 0x7f9478a3c9e8>}\n", |
| 141 | + "create: <class '__main__.PartsTypeProxyFactory'> ('Screw', <__main__.PartProxy object at 0x7f9478a3ceb8>)\n", |
| 142 | + "__new__: <class '__main__.PartsTypeProxyFactory'> <class '__main__.Part'>\n", |
139 | 143 | "__init__: Screw Bolt, parent: Nut, parent: None \n",
|
140 |
| - "{1: <__main__.Part object at 0x7fb5744a3f28>, 2: <__main__.Part object at 0x7fb5744a3a58>, 3: <__main__.Part object at 0x7fb5744a3dd8>}\n" |
| 144 | + "{1: <__main__.Part object at 0x7f9478a3cf60>, 2: <__main__.Part object at 0x7f9478a3c9e8>, 3: <__main__.Part object at 0x7f9478a3c9b0>}\n" |
141 | 145 | ]
|
142 | 146 | }
|
143 | 147 | ],
|
|
176 | 180 | {
|
177 | 181 | "data": {
|
178 | 182 | "text/plain": [
|
179 |
| - "{1: <__main__.Part at 0x7fb5744a3f28>,\n", |
180 |
| - " 2: <__main__.Part at 0x7fb5744a3a58>,\n", |
181 |
| - " 3: <__main__.Part at 0x7fb5744a3dd8>}" |
| 183 | + "{1: <__main__.Part at 0x7f9478a3cf60>,\n", |
| 184 | + " 2: <__main__.Part at 0x7f9478a3c9e8>,\n", |
| 185 | + " 3: <__main__.Part at 0x7f9478a3c9b0>}" |
182 | 186 | ]
|
183 | 187 | },
|
184 | 188 | "execution_count": 5,
|
|
220 | 224 | "name": "stdout",
|
221 | 225 | "output_type": "stream",
|
222 | 226 | "text": [
|
223 |
| - "create: ('Frame',)\n", |
224 |
| - "<class '__main__.Part'> Frame\n", |
| 227 | + "create: <class '__main__.PartsTypeProxyFactory'> ('Frame',)\n", |
| 228 | + "__new__: <class '__main__.PartsTypeProxyFactory'> <class '__main__.Part'>\n", |
225 | 229 | "__init__: Frame None\n",
|
226 |
| - "{1: <__main__.Part object at 0x7fb5744a3f28>, 2: <__main__.Part object at 0x7fb5744a3a58>, 3: <__main__.Part object at 0x7fb5744a3dd8>, 4: <__main__.Part object at 0x7fb574490e48>}\n", |
| 230 | + "{1: <__main__.Part object at 0x7f9478a3cf60>, 2: <__main__.Part object at 0x7f9478a3c9e8>, 3: <__main__.Part object at 0x7f9478a3c9b0>, 4: <__main__.Part object at 0x7f9478a2af98>}\n", |
227 | 231 | "Joining with part Frame, parent: None \n"
|
228 | 232 | ]
|
229 | 233 | }
|
|
299 | 303 | {
|
300 | 304 | "data": {
|
301 | 305 | "text/plain": [
|
302 |
| - "{3: <__main__.Part at 0x7fb5744a3dd8>, 4: <__main__.Part at 0x7fb574490e48>}" |
| 306 | + "{3: <__main__.Part at 0x7f9478a3c9b0>, 4: <__main__.Part at 0x7f9478a2af98>}" |
303 | 307 | ]
|
304 | 308 | },
|
305 | 309 | "execution_count": 12,
|
|
349 | 353 | {
|
350 | 354 | "data": {
|
351 | 355 | "text/plain": [
|
352 |
| - "{4: <__main__.Part at 0x7fb574490e48>}" |
| 356 | + "{4: <__main__.Part at 0x7f9478a2af98>}" |
353 | 357 | ]
|
354 | 358 | },
|
355 | 359 | "execution_count": 15,
|
|
529 | 533 | "print(rect.area())"
|
530 | 534 | ]
|
531 | 535 | },
|
| 536 | + { |
| 537 | + "cell_type": "markdown", |
| 538 | + "metadata": {}, |
| 539 | + "source": [ |
| 540 | + "### Metaclass Solution" |
| 541 | + ] |
| 542 | + }, |
532 | 543 | {
|
533 | 544 | "cell_type": "code",
|
534 | 545 | "execution_count": 22,
|
|
603 | 614 | "output_type": "stream",
|
604 | 615 | "text": [
|
605 | 616 | "Metaclass=> <class '__main__.PolygonType'> Rectangle\n",
|
606 |
| - "Attaching function <function rectangle_valid at 0x7fb57443e1e0> as is_valid method\n", |
| 617 | + "Attaching function <function rectangle_valid at 0x7f94781d3510> as is_valid method\n", |
607 | 618 | "Metaclass=> <class '__main__.PolygonType'> Triangle\n",
|
608 |
| - "Attaching function <function triangle_valid at 0x7fb57443e400> as is_valid method\n" |
| 619 | + "Attaching function <function triangle_valid at 0x7f94781d3730> as is_valid method\n" |
609 | 620 | ]
|
610 | 621 | }
|
611 | 622 | ],
|
|
0 commit comments