python设计工具包:接口、声明的异常抛出、类成员可访问性级别(针对人类的私有和受保护的方法)。

accessif的Python项目详细描述


访问

releasepypi version shields.io构建状态codecov

downloadspypi licensepypi pyversions

habrahaabr入门

  • 用法
  • 禁用检查
  • 贡献
  • 参考资料
  • 开始

    什么是accessify

    访问是一个python设计工具包,提供:

    • 接口,
    • 声明的异常抛出,
    • 班级成员的无障碍水平。

    它们可以相互结合,使您的代码更精简,而且此库的使用更合理。

    访问修饰符

    访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法。 可访问性级别是从语言中的框中显示的,比如<代码>代码> >代码>代码>

    classCar{privatestringStartEngine(){// Code here.}}

    但是,python的这种方式并不相同。

    动机

    • 我们都是这里的成年人这是python哲学的一部分依赖于人为因素而不是解释器。
    • 有一个python约定,即对受保护和私有成员使用下划线前缀,这有点难看。 不是吗?例如,对于下面提供类A私有成员的代码。
    classCar:def__start_engine(self,*args,**kwargs):pass
    • 此外,私有和受保护的方法可以很容易地在类之外访问。这真的是一个推迟 正确设计系统以减少积压,增加技术债务。
    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()

    界面

    接口是一个约定,它指定了一组方法和属性,这些方法和属性要求在任何实现类上都可用。 如果类实现了接口,但未实现其方法,则应引发相应的错误。界面在框中显示 语言如<代码> C++<代码>、<代码> C >和<代码> Java<代码>

    interfaceHumanInterface{publicstringEatFood();}classHuman:HumanInterface{publicstringEatFood(){// Code here.}}

    但是,python的这种方式并不相同。

    动机

    • 该接口在实现创建过程中进行检查,但实际上在执行过程中不会进行检查,如python中的abc模块。
    • 接口要求实现的方法参数与接口中声明的参数匹配,abc-not.
    • 许多提供接口的库不再受支持。
    • 许多提供接口的库需要编写大量代码才能使用其功能,而这个库不需要。

    如何安装

    使用pip安装来自pypi的包。

    $ pip3 install accessify
    

    用法

    访问修饰符

    专用

    • 私人成员只能在班级内进入。

    在本例中,car类包含一个名为start_engine的私有成员。作为私有成员,不能访问它们 除非通过成员方法。私有成员启动引擎只能通过名为运行的公共方法访问

    fromaccessifyimportprivateclassCar:@privatedefstart_engine(self):return'Engine sound.'defrun(self):returnself.start_engine()if__name__=='__main__':car=Car()assert'Engine sound.'==car.run()car.start_engine()

    上面的代码将产生以下回溯。

    Traceback (most recent call last):
      File "examples/access/private.py", line 24, in <module>
        car.start_engine()
      File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/accessify/main.py", line 92, in private_wrapper
        class_name=instance_class.__name__, method_name=method.__name__,
    accessify.errors.InaccessibleDueToItsProtectionLevelException: Car.start_engine() is inaccessible due to its protection level
    

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    $ curl -L https://git.io/fhASP > private.py
    $ python3 private.py
    
    • 子类无法访问父私有成员。

    在本例中,car类包含一个名为start_engine的私有成员。作为私有成员,不能访问它们 从子类中,在我们的例子中是tesla。因此,由tesla重写的方法run类不能使用父类的启动引擎成员。

    小精灵α9

    上面的代码将产生以下回溯。

    classCar{privatestringStartEngine(){// Code here.}}
    0

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar{privatestringStartEngine(){// Code here.}}
    1

    受保护

    • 受保护的成员可以在其类内和通过派生类实例访问。

    在本例中,car类包含一个名为start_engine的受保护成员。作为受保护的成员,无法访问它们 除非通过成员方法。只有通过名为run的公共方法才能访问受保护的成员启动引擎

    classCar{privatestringStartEngine(){// Code here.}}
    2

    上面的代码将产生以下回溯。

    classCar{privatestringStartEngine(){// Code here.}}
    3

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar{privatestringStartEngine(){// Code here.}}
    4
    • 儿童班可以访问这些受保护的成员。

    在本例中,car类包含一个名为start_engine的受保护成员。作为受保护的成员,可以访问它们 从子类中,在我们的例子中是tesla。因此,重写方法runbytesla类可以使用父类的启动引擎成员。

    classCar{privatestringStartEngine(){// Code here.}}
    5

    代码将正常工作。

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar{privatestringStartEngine(){// Code here.}}
    6

    其他功能
    • accessifydecorator从类中删除私有和受保护的成员dir
    classCar{privatestringStartEngine(){// Code here.}}
    7

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar{privatestringStartEngine(){// Code here.}}
    8

    接口

    单接口

    • 当您声明类实现接口时,类应该实现接口中显示的所有方法。

    在本例中,有一个名为humaninterface的接口,它包含两个方法loveeat。另外,还有 一个类human实现了接口,但漏掉了方法"eat",因此应该引发相应的错误。

    classCar{privatestringStartEngine(){// Code here.}}
    9

    上面的代码将产生以下回溯。

    classCar:def__start_engine(self,*args,**kwargs):pass
    0

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar:def__start_engine(self,*args,**kwargs):pass
    1
    • 当声明类实现接口时,类应实现接口中显示的所有方法 包括接受参数的编号、顺序和命名。

    在本例中,有一个名为humaninterface的接口,它包含两个方法loveeat。另外,还有 一个类human实现了接口,但遗漏了方法"eat"的4个参数中的3个,因此应该引发相应的错误。

    classCar:def__start_engine(self,*args,**kwargs):pass
    2

    上面的代码将产生以下回溯。

    classCar:def__start_engine(self,*args,**kwargs):pass
    3

    使用示例来测试它。 举个例子通过curl输入上面的代码,并通过python3运行它

    classCar:def__start_engine(self,*args,**kwargs):pass
    4
    • 当声明类实现接口时,类应实现接口中显示的所有方法 包括接受参数的编号、顺序和命名,以及访问修饰符类型。

    在本例中,有一个名为humaninterface的接口,它包含两个方法loveeat。另外,还有 一个类human实现了接口,但错过了方法"eat"的私有访问修饰符类型,因此 应该引发错误。

    classCar:def__start_engine(self,*args,**kwargs):pass
    5

    上面的代码将产生以下回溯。

    classCar:def__start_engine(self,*args,**kwargs):pass
    6

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar:def__start_engine(self,*args,**kwargs):pass
    7

    多个接口

    • 一个类可以实现多个接口。
    • 当您声明实现一堆接口的类时,一个类应该实现 每个接口包括接受参数的编号、顺序和命名以及访问修饰符类型。

    在本例中,有一个接口HumanSoulInterface包含一个名为Love的方法和接口HumanBasicInterface的方法 包含名为eat的方法。此外,还有一个类human从第一个接口实现方法love,但是 错过了第二个方法的"eat",因此应提出相应的错误。

    classCar:def__start_engine(self,*args,**kwargs):pass
    8

    上面的代码将产生以下回溯。

    classCar:def__start_engine(self,*args,**kwargs):pass
    9

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    0

    异常抛出声明
    • 当声明接口方法引发特定异常时,实现接口的类方法应 在引发此异常的正文中包含代码。
    • 您可以声明interface方法抛出多个异常。

    在本例中,exceptionhumandoesnotexisterror和exceptionhumanalreadyinloveerror声明由 human类方法调用了love,但方法未能引发第二个异常,因此应引发相应的错误。

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    1

    上面的代码将产生以下回溯。

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    2

    使用示例来测试它。 通过curl获取包含上述代码的示例,并通过python3运行它。

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    3

    禁用检查

    您可以禁用所有访问检查。例如,在生产中,当您不应该检查它时,因为它已经被检查过了 正在开发中。然后使用以下环境变量:

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    4

    贡献

    克隆项目并安装要求:

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    5

    如果您更喜欢使用docker并希望轻松更改python环境,请遵循:

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    6

    输入container bash,选中pythonversion并运行测试:

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    7

    使用以下命令清理容器和图像:

    classCar:def_start_engine(self,*args,**kwargs):passdef__start_engine(self,*args,**kwargs):passcar=Car()car._start_engine()car._Car__start_engine()
    8

    当您要进行更改时,请确保您的代码通过检查程序 并由小于a h的测试覆盖ref="https://docs.pytest.org/en/latest" rel="nofollow">pytest

    如果您是新会员,请阅读:

    参考文献

    请查看以熟悉班级成员的辅助功能级别:

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    数据库在使用TDengine时,如何保持Java客户端的高可用性?   javajavax。命名。无法将引用转换为javax。sql。数据源错误   理解Java中的溢出问题   java如何将数据请求与数据更新过程同步?   java在使用多部分上传图像时如何在客户端获取进程   java如何在FusionCharts中使用json数组?   java哈希映射“无法解析”。可以执行方法,但不能打印   java如何让用户更改JtextArea的背景色   java我们应该如何使用@XMLRootElement配置响应对象而不使用out   java BigQuery BigQueryException更新或删除   java使用新对象更新ArrayList+删除旧对象   java Alarmmanager立即启动   javascript实时Html推送通知   安卓如何从java代码更改视图大小   java Kafka 1.1多个消费群体滞后   多线程Java使用FileWriter写入同一文件引入多线程   java Jdbc连接池,按用户名进行连接缓存   java错误使用OpenGL?