?? ???
????? ???? "??? ??"? ?? ?? ???? ?? ??? ??? ??? ???? ??? ?? ??????. ??? ???? __get__(), __set__() ? __delete__()???. ??? ???? ?? ??? ??????? ???.
??? ?? ?? ??? ??? ??? ??(__dict__)?? ????(get), ??(set) ? ??(delete)?? ????. ?? ??, a.x? ?? ?? ??? a.__dict__['x']??, ?? ??(a).__dict__['x']? ????, ?? ?? type(a)(????? ??)? ?? ???? ????. ?? ?? ????? Python? ???? ???? ???? ?? ?? ??? ??????. ?? ???? ? ???? ???? ??? ??? ??? ???? ?? ????. ???? ??? ??? ??? ????? ?????. ?? ??? ??? ??? ???? ?? ??? ???? ?? ??????. ??? ?? ?? ?? ?? ??? ???. ??? ??? ???? ?? ? ??? ?? ???? ?? ?? ?? ????? ????? ????.
?? ?? ??????? ???? ??? ?? ???? ?? ???? ???? ??? ???? ??? ?? ???? ??? ? ????. Django? ORM?? models.Model? InterField? ?? ??? ???? ?? ?? ??? ?????.
?? ?? ??? ???????.
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class User(object): def __init__(self, name='兩點(diǎn)水', sex='男'): self.sex = sex self.name = name def __get__(self, obj, objtype): print('獲取 name 值') return self.name def __set__(self, obj, val): print('設(shè)置 name 值') self.name = val class MyClass(object): x = User('兩點(diǎn)水', '男') y = 5 if __name__ == '__main__': m = MyClass() print(m.x) print('\n') m.x = '三點(diǎn)水' print(m.x) print('\n') print(m.x) print('\n') print(m.y)
?? ??? ??? ????.
獲取 name 值 兩點(diǎn)水 設(shè)置 name 值 獲取 name 值 三點(diǎn)水 獲取 name 值 三點(diǎn)水 5
? ??? ?? __get__() ? __set__() ???? ??? ? ??? ? ????.
? ?? ???? ?? ???
??? ??? "??" ?? "??" ??? ??? ? ??? ?? ?? ????. ?? ??? ???? ???? ?????. ? ????? ??? ???? ? ?? ??? ????.
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- class Meter(object): def __init__(self, value=0.0): self.value = float(value) def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value) class Foot(object): def __get__(self, instance, owner): return instance.meter * 3.2808 def __set__(self, instance, value): instance.meter = float(value) / 3.2808 class Distance(object): meter = Meter() foot = Foot() if __name__ == '__main__': d = Distance() print(d.meter, d.foot) d.meter = 1 print(d.meter, d.foot) d.meter = 2 print(d.meter, d.foot)
?? ??:
0.0 0.0 1.0 3.2808 2.0 6.5616
?? ??? Distance ????? ?? ???? ?? ??? ??? ?? ???? ???? ???? ??? ????? ??? ?? ????. __get__? ???? ?????.
??? ???? int? ????? ?? ???????. ??? __set__? ?????.
??? ??(??, ??)? ????? ??? ? ??? ?? ??? ???(??)? ???? ???. ??? ??? ???? Foot? instance.meter? ?? ??? ????? ??? ???? ? ????.