Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # python version >= 3.6
- def definegetters(klass):
- for name, type_ in klass.__annotations__.items():
- default = getattr(klass, name, type_())
- # デフォルト引数にコピーしないとループで変数が上書きされる
- def _getter(self, private='_'+name, default=default):
- try:
- return getattr(self, private)
- except AttributeError:
- setattr(self, private, default)
- return getattr(self, private)
- exec(f'klass.{name} = property(_getter)')
- return klass
- @definegetters
- class Foo:
- # 変数へのアノテーション(3.6から)
- spam: int
- ham: str
- eggs: bool = True
- def __init__(self):
- self._ham = 'example'
- if __name__ == '__main__':
- foo = Foo()
- print(repr(foo.spam)) # => 0
- print(repr(foo.ham)) # => 'example'
- print(repr(foo.eggs)) # => True
- foo._spam = 100
- print(repr(foo.spam)) # => 100
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement