python的私有和受保护访问修饰符
access-modifiers的Python项目详细描述
python的访问修饰符
这个包为python提供了两个访问修饰符:私有方法和受保护方法。目标是能够将方法记录为私有的或受保护的,并提供基本的保护,防止意外地从允许的范围之外调用私有的和受保护的方法。
如何使用
私有方法的示例用法:
fromaccess_modifiersimportprivatemethodclassClass:@privatemethoddefprivate_method(self)->str:return"private method"defpublic_method(self)->str:return"public method calls "+self.private_method()c=Class()print(c.public_method())# Prints "public method calls private method"print(c.private_method())# Raises an exception
受保护方法的示例用法:
fromaccess_modifiersimportprotectedmethodclassClass:@protectedmethoddefprotected_method(self)->str:return"protected method"defpublic_method(self)->str:return"public method calls "+self.protected_method()classSubclass(Class):@protectedmethoddefprotected_method(self)->str:return"overridden protected method calls "+super().protected_method()c=Subclass()print(c.public_method())# Prints "public method calls overridden protected method calls protected method"print(c.protected_method())# Raises an exception
私有方法可以与静态方法相结合。注意顺序很重要:staticmethod应该是最外层的装饰器。
fromaccess_modifiersimportprivatemethodclassClass:@staticmethod@privatemethoddefstatic_private_method()->str:return"static private method"defpublic_method(self)->str:return"public method calls "+self.static_private_method()c=Class()print(c.public_method())# Prints "public method calls static private method"print(c.static_private_method())# Raises an exception
不支持将受保护的方法与静态方法组合。还不支持将访问修饰符与类方法结合使用。
性能
访问修饰符decorators通过查看调用decorator的代码来决定是否允许它调用该方法。为此,decorators使用cpython的实现细节,比如sys.\u getframe()和代码对象的名称,比如lambdas和modules。这些检查在每个方法调用上完成。因此,有相当大的性能影响。因此,建议在测试期间使用访问修饰符,并在生产中使用access_modifiers.disable()
方法关闭它们。请注意,在计算任何访问修饰符装饰符之前,您需要调用此方法,即:
fromaccess_modifiersimportdisable,privatemethoddisable()# This will disable the access checksclassClass:@privatemethoddefprivate_method(self)->str:return"private_method"disable()# Calling disable here will not work, Class.private_method has already been wrapped
安装
该包可从python包索引获得,安装时使用pip install access-modifiers
。
开发
克隆存储库:git clone git@github.com:fniessink/access-modifiers.git
。
安装开发依赖项:pip install -r requirements-dev.txt
。
运行unittests并测量覆盖率(应该始终为100%):ci/unittest.sh
。
运行pylint(应该得到10分)和mypy(不应该抱怨):ci/quality.sh
。
该实现由(单元)测试驱动,并具有100%的单元测试语句和分支覆盖率。请查看测试以查看当前涵盖的使用场景。