区块链技术博客
www.b2bchain.cn

python 实现类属性的懒加载求职学习资料

本文介绍了python 实现类属性的懒加载求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

class lazy:     # 告诉 Python 不要创建对象的 __dict__,     # 而是只给一个固定集合的属性分配空间。     __slots__ = ['func']      def __init__(self, func):         self.func = func      def __get__(self, instance, owner):         name = self.func.__name__  # 取出方法名         if owner.__dict__[name] is self:             # 第一次取值时会进入到此条件,             # 因为使用装饰器修饰的方法会返回装饰器本身。             #             # 修改 owner.name 属性为 func 的返回值。             # 此时 owner.name 不再是一个装饰器,也不是一个方法,而是 func 返回的值!             setattr(owner, name, self.func(owner))         return owner.__dict__[name]  class MyClass:          def name(self) -> str:         print("debug: name(self)")         return "get name"  if __name__ == '__main__':     name = MyClass.name  # output: 'debug: name(self)'     print(f'[{name}]', type(name))  # => [get name] <class 'str'>     print(f'[{MyClass.name}]')  # => [get name]

可以看到,第一次使用 MyClass.name 时会进入到 name 方法的内部输出 debug: name(self) ,然后通过 lazy.__get__ 方法返回值。在返回的过程中 MyClass.name 已经被我们修改为 lazy.func 方法的返回值了。后续再使用 MyClass.name 时会一直返回这个值。

class lazy:     # 告诉 Python 不要创建对象的 __dict__,     # 而是只给一个固定集合的属性分配空间。     __slots__ = ['func']      def __init__(self, func):         self.func = func      def __get__(self, instance, owner):         name = self.func.__name__  # 取出方法名         if owner.__dict__[name] is self:             # 第一次取值时会进入到此条件,             # 因为使用装饰器修饰的方法会返回装饰器本身。             #             # 修改 owner.name 属性为 func 的返回值。             # 此时 owner.name 不再是一个装饰器,也不是一个方法,而是 func 返回的值!             setattr(owner, name, self.func(owner))         return owner.__dict__[name]  class MyClass:          def name(self) -> str:         print("debug: name(self)")         return "get name"  if __name__ == '__main__':     name = MyClass.name  # output: 'debug: name(self)'     print(f'[{name}]', type(name))  # => [get name] <class 'str'>     print(f'[{MyClass.name}]')  # => [get name]

可以看到,第一次使用 MyClass.name 时会进入到 name 方法的内部输出 debug: name(self) ,然后通过 lazy.__get__ 方法返回值。在返回的过程中 MyClass.name 已经被我们修改为 lazy.func 方法的返回值了。后续再使用 MyClass.name 时会一直返回这个值。

class lazy:     # 告诉 Python 不要创建对象的 __dict__,     # 而是只给一个固定集合的属性分配空间。     __slots__ = ['func']      def __init__(self, func):         self.func = func      def __get__(self, instance, owner):         name = self.func.__name__  # 取出方法名         if owner.__dict__[name] is self:             # 第一次取值时会进入到此条件,             # 因为使用装饰器修饰的方法会返回装饰器本身。             #             # 修改 owner.name 属性为 func 的返回值。             # 此时 owner.name 不再是一个装饰器,也不是一个方法,而是 func 返回的值!             setattr(owner, name, self.func(owner))         return owner.__dict__[name]  class MyClass:          def name(self) -> str:         print("debug: name(self)")         return "get name"  if __name__ == '__main__':     name = MyClass.name  # output: 'debug: name(self)'     print(f'[{name}]', type(name))  # => [get name] <class 'str'>     print(f'[{MyClass.name}]')  # => [get name]

可以看到,第一次使用 MyClass.name 时会进入到 name 方法的内部输出 debug: name(self) ,然后通过 lazy.__get__ 方法返回值。在返回的过程中 MyClass.name 已经被我们修改为 lazy.func 方法的返回值了。后续再使用 MyClass.name 时会一直返回这个值。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » python 实现类属性的懒加载求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们