Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.97 KB | None | 0 0
  1. # python version >= 3.6
  2.  
  3. def definegetters(klass):
  4.     for name, type_ in klass.__annotations__.items():
  5.         default = getattr(klass, name, type_())
  6.         # デフォルト引数にコピーしないとループで変数が上書きされる
  7.         def _getter(self, private='_'+name, default=default):
  8.             try:
  9.                 return getattr(self, private)
  10.             except AttributeError:
  11.                 setattr(self, private, default)
  12.                 return getattr(self, private)
  13.         exec(f'klass.{name} = property(_getter)')
  14.     return klass
  15.  
  16. @definegetters
  17. class Foo:
  18.     # 変数へのアノテーション(3.6から)
  19.     spam: int
  20.     ham: str
  21.     eggs: bool = True
  22.  
  23.     def __init__(self):
  24.         self._ham = 'example'
  25.  
  26. if __name__ == '__main__':
  27.     foo = Foo()
  28.     print(repr(foo.spam))  # => 0
  29.     print(repr(foo.ham))   # => 'example'
  30.     print(repr(foo.eggs))  # => True
  31.     foo._spam = 100
  32.     print(repr(foo.spam))  # => 100
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement