python-mastery/Exercises/soln6_3.md

59 lines
1.1 KiB
Markdown
Raw Normal View History

2023-07-17 03:21:00 +02:00
# Exercise 6.3 - Solution
```python
# structure.py
import sys
import inspect
class Structure:
_fields = ()
@staticmethod
def _init():
locs = sys._getframe(1).f_locals
self = locs.pop('self')
for name, val in locs.items():
setattr(self, name, val)
def __setattr__(self, name, value):
if name.startswith('_') or name in self._fields:
super().__setattr__(name, value)
else:
raise AttributeError('No attribute %s' % name)
def __repr__(self):
return '%s(%s)' % (type(self).__name__,
', '.join(repr(getattr(self, name)) for name in self._fields))
@classmethod
def set_fields(cls):
sig = inspect.signature(cls)
cls._fields = tuple(sig.parameters)
```
Here is the `Stock` class in progress:
```python
# stock.py
from structure import Structure
class Stock(Structure):
def __init__(self, name, shares, price):
self._init()
@property
def cost(self):
return self.shares * self.price
def sell(self, nshares):
self.shares -= nshares
Stock.set_fields()
```
[Back](ex6_3.md)